Cactoos中的面向对象的声明式输入/输出

Cactoos是一个面向对象的Java原语库, 我们几周前才开始使用它。 目的是为JDK,Guava,Apache Commons等提供一种干净且更具声明性的替代方案。 我们不是使用静态过程,而是使用对象的使用方式,而是使用对象。 让我们看看输入/输出如何以面向对象的方式工作。

假设您要读取文件。 这是使用JDK7中的实用程序类 Files的静态方法readAllBytes()进行的操作:

byte[] content = Files.readAllBytes(new File("/tmp/photo.jpg").toPath()
);

这段代码非常重要-它会立即读取文件内容,并将其放入数组中。

这就是您使用Cactoos的方法 :

Bytes source = new InputAsBytes(new FileAsInput(new File("/tmp/photo.jpg"))
);

注意-还没有方法调用。 只有三个构造函数或三个类组成一个更大的对象。 对象source的类型为Bytes ,代表文件的内容。 为了从中获取内容,我们将其方法asBytes()

bytes[] content = source.asBytes();

这是触摸文件系统的时刻。 如您所见,这种方法绝对是声明性的,并且由于它具有面向对象的所有优点。

这是另一个例子。 假设您要向文件中写入一些文本。 这是您在Cactoos中的操作方法。 首先,您需要Input

Input input = new BytesAsInput(new TextAsBytes(new StringAsText("Hello, world!"))
);

然后,您需要Output

Output output = new FileAsOutput(new File("/tmp/hello.txt")
);

现在,我们要将输入复制到输出。 OOP中没有“复制”操作。 而且,根本不能进行任何操作。 只是对象。 我们有一个名为TeeInput的类,它是一个Input ,它将您从其中读取的所有内容复制到Output ,类似于Apache Commons的 TeeInputStream所做的TeeInputStream ,但被封装了。 因此,我们不进行复制,而是创建一个Input ,如果您触摸它,它将复制:

Input tee = new TeeInput(input, output);

现在,我们必须“触摸”它。 而且我们必须触摸它的每个字节,以确保它们都被复制了。 如果我们仅read()第一个字节,则只有一个字节将被复制到文件中。 触摸所有对象的最佳方法是计算tee对象的大小,逐字节地计算。 我们有一个对象,叫做LengthOfInput 。 它封装了一个Input ,其行为类似于其以字节为单位的长度:

Scalar<Long> length = new LengthOfInput(tee);

然后我们从中取出值,然后进行文件写入操作:

long len = length.asValue();

因此,将字符串写入文件的整个操作将如下所示:

new LengthOfInput(new TeeInput(new BytesAsInput(new TextAsBytes(new StringAsText("Hello, world!"))),new FileAsOutput(new File("/tmp/hello.txt")))
).asValue(); // happens here

这是它在JDK7中的替代程序:

Files.write(new File("/tmp/hello.txt").toPath(),"Hello, world!".getBytes()
);

“为什么面向对象即使更长,也更好?” 我听到你问。 因为它完美地解耦了概念,而过程化的概念却将它们保持在一起。

假设您正在设计一个类,该类应该加密一些文本并将其保存到文件中。 这是您将如何以程序方式设计它的方法(当然,这不是真正的加密):

class Encoder {private final File target;Encoder(final File file) {this.target = file;}void encode(String text) {Files.write(this.target,text.replaceAll("[a-z]", "*"));}
}

工作正常,但是当您决定扩展它以同时写入OutputStream时,会发生什么? 您将如何修改此类? 那会多么丑陋? 那是因为设计不是面向对象的。

这就是您将使用Cactoos以面向对象的方式进行相同设计的方式:

class Encoder {private final Output target;Encoder(final File file) {this(new FileAsOutput(file));}Encoder(final Output output) {this.target = output;}void encode(String text) {new LengthOfInput(new TeeInput(new BytesAsInput(new TextAsBytes(new StringAsText(text.replaceAll("[a-z]", "*")))),this.target)).asValue();}
}

如果我们希望OutputStream被接受,我们该怎么做? 我们只添加一个辅助构造函数:

class Encoder {Encoder(final OutputStream stream) {this(new OutputStreamAsOutput(stream));}
}

做完了 那是多么容易和优雅。

那是因为概念被完美地分离并且功能被封装了。 在该过程示例中,该对象的行为位于方法外部(在encode()方法中encode() 。 该文件本身不知道如何写,有些外部过程Files.write()知道。

相反,在面向对象的设计中, FileAsOutput知道如何编写,而其他人FileAsOutput知道。 文件写入功能被封装,这使得可以用任何可能的方式装饰对象,从而创建可重用和可替换的复合对象。

您现在看到OOP的美丽了吗?

翻译自: https://www.javacodegeeks.com/2017/06/object-oriented-declarative-inputoutput-cactoos.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机研发部门职责,计算机研发岗位职责

计算机视觉研发员 •负责计算机视觉相关的技术研发工作,包括但不限于:人脸识别、物体检测与分类、静态图像或视频分类与分析、图像质量评价、图像处理等•负责计算机视觉方向前沿问题的研究,结合未来实际应用场景,提供技术解决方案•负责完成相关技术的研究项目申请、学术论文发…

vue中请求接口怎么封装公共地址_vue请求接口的封装

import api from ./api;import request from./request;//获取url上的rest参数&#xff0c;返回参数列表 /{userId}/{roleId} > [userId, roleId]functiongetUrlParams(url) {return (url.match(/\{(\w)\}/g) || []).map(param > /\{(\w)\}/.exec(param)[1]);}/** 创建一个…

java实现迷你计算机,用JAVA写一个迷你编辑器.doc

用JAVA写一个迷你编辑器用JAVA编写一个迷你编辑器WINDOWS的记事本程序是非常方便的一个文字处理工具&#xff0c;用它来编辑纯文本文件快捷而灵巧。我用JAVA写了一个编辑器程序&#xff0c;模仿“记事本”的功能。这不是为了替代记事本&#xff0c;而是因为下列两个目的&#x…

cypress测试脚本_Cypress 自动化测试学习使用

安装mkdir cypress-startnpm install# 进入创建的项目目录cd /your/project/pathcd cypress-startnpm install cypress --save-devyarn addcd /your/project/pathcd cypress-startyarn add cypress --dev打开运行cpress./node_modules/.bin/cypress open或者使用npm bin$(npm b…

hadoop综述_Hadoop书籍赠品–综述

hadoop综述各位极客&#xff0c; Packt Publishing关于Apache Hadoop 的书籍赠品已经结束。 您可以在这里找到比赛的原始帖子。 获奖者 将会获得这本书奖的6位幸运获奖者是&#xff08;姓名出现在他们的电子邮件中&#xff09;&#xff1a; Hadoop真实世界解决方案食谱 塞…

便捷式计算机无线功能按钮,TP-Link TL-MR13U便携式无线路由器Client模式设置

本文介绍了TP-Link TL-MR13U便携式无线路由器&#xff0c;在“客户端模式(Client)”下的设置方法。TL-MR13U工作在“客户端模式(Client)”时&#xff0c;主要作用是用来接收无线WiFi信号&#xff0c;把无线WiFi信号转换为有线网络&#xff0c;实现让台式电脑上网。TP-Link TL-M…

Java命令行界面(第6部分):JOpt简单

JOpt Simple的主页将这个基于Java的库称为“用于解析命令行选项的Java库&#xff0c;例如您可能传递给调用javac的Java库&#xff0c;”该Java库试图“使用POSIX getopt&#xff08;&#xff09;的命令行选项语法&#xff09;和GNU getopt_long&#xff08;&#xff09; 。” 这…

矩阵相乘的strassen算法_矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)...

矩阵乘法的Strassen这个算法就是在矩阵乘法中采用分治法&#xff0c;能够有效的提高算法的效率。先来看看咱们在高等代数中学的普通矩阵的乘法两个矩阵相乘上边这种普通求解方法的复杂度为: O(n3)也称之为暴力求解或者朴素求解这是暴力求解的代码&#xff0c;三重循环&#xff…

计算机c盘哪些东西可以清理,细说电脑c盘哪些文件可以删除

有些网友反映&#xff0c;自己看C盘里的文件太多了&#xff0c;电脑又太卡&#xff0c;情急之下就把里面的东西删掉了&#xff0c;现在系统都不能用了。为了避免大家再入这个坑&#xff0c;我给大家讲一下哪些是C盘里的无用文件&#xff0c;并且删除后不会影响系统使用C盘是指电…

springboot 注解动态赋值_SpringBoot 使用 @Value 注解读取配置文件给静态变量赋值

1、application.properties 配置文件CxU免费资源网mail.usernamexue163.commail.passwordxuemail.hostsmtp.163.commail.smtp.authtrue2、给普通变量赋值&#xff0c;直接在变量上添加 Value 注解CxU免费资源网import org.springframework.beans.factory.annotation.Value;publ…

软件测试度量计算方法有哪些,软件测试度量(三)

进度差异趋势6.4.3 范围变化(SC)这个指标指出如何固定测试范围。下面总范围 以前的范围 新范围&#xff0c;如果范围扩大的话总范围 以前的范围 - 新范围&#xff0c;如果范围缩小的话一个发布版本范围变化趋势7、结论度量是评估的重要组成部分以及任何业务改进的基础。是应…

ceph与hdfs的比较_分布式存储中HDFS与Ceph两者的区别是什么,各有什么优势?

过去两年&#xff0c;我的主要工作都在Hadoop这个技术栈中&#xff0c;而最近有幸接触到了Ceph。我觉得这是一件很幸运的事&#xff0c;让我有机会体验另一种大型分布式存储解决方案&#xff0c;可以对比出HDFS与Ceph这两种几乎完全不同的存储系统分别有哪些优缺点、适合哪些场…

使用带有OAuth的Spring Security保护资源

1.简介 在本教程中&#xff0c;我们将研究如何使用Spring Security和OAuth来基于路径模式&#xff08; / api / ** &#xff09;保护服务器上的管理资源。 我们配置的另一个路径模式&#xff08; / oauth / token &#xff09;将帮助已配置的授权服务器生成访问令牌。 请注意&a…

2080ti服务器支持什么系统,2080ti深度学习性能

AI开发平台ModelArtsModelArts是面向开发者的一站式AI开发平台&#xff0c;为机器学习与深度学习提供海量数据预处理及半自动化标注、大规模分布式Training、自动化模型生成&#xff0c;及端-边-云模型按需部署能力&#xff0c;帮助用户快速创建和部署模型&#xff0c;管理全周…

pythonset是什么类型的游戏_Python集合(set)类型的操作

原文详见&#xff1a;http://blog.csdn.net/business122/article/details/7541486python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等…

服务器选购seo优化规则,网站seo优化注意事项1—域名和服务器选择

原标题&#xff1a;网站seo优化注意事项1—域名和服务器选择一个网站的域名和服务器是很重要的&#xff0c;这关乎网站的优化前提&#xff0c;作为一个seo优化人员必须要对自己网站的域名和服务器有所了解。网站seo优化注意事项1&#xff1a;域名的关联性域名怎么选择呢&#x…

as cast float server sql_Sql Server中Float格式转换字符串varchar方法(转)

SELECT CONVERT(varchar(100), CAST(testFloat AS decimal(38,2)))SELECT STR(testFloat, 38, 2)从Excel中导入到sql2000&#xff0c;有一列“联系方式”变成了float类型&#xff0c;我想转换成nvarchar类型&#xff0c;用下面的语句select convert(nvarchar(30),convert(int,联…

openjpa_OpenJPA:内存泄漏案例研究

openjpa本文将提供完整的根本原因分析详细信息以及解决影响Oracle Weblogic Server 10.0生产环境的Java堆内存泄漏&#xff08;Apache OpenJPA泄漏&#xff09;的方法。 这篇文章还将演示在管理javax.persistence.EntityManagerFactory生命周期时遵循Java Persistence API最佳实…

美国凯斯西储大学计算机硕士专业怎么样,在凯斯西储大学读硕士大约需要多少花费?...

凯斯西储大学是美国著名大学之一&#xff0c;始建于1826年&#xff0c;坐落于俄亥俄州的克里夫兰&#xff0c;是一所以独立研究闻名的世界顶级私立大学&#xff0c;美国一级国家级大学。美国作为当今世界留学费用最高的国家之一&#xff0c;费用问题是所有赴美留学的学生都非常…

ffmpeg 缩放算法_图像尺寸调整算法介绍并手动实现近邻算法

课程更新完毕&#xff0c;后面会根据同学的意见维护此课程课程讲师&#xff1a;【夏曹俊】课程基于opencv**版3.2讲解&#xff0c;全部使用**的c接口&#xff0c;旧的接口会逐步被opencv抛弃&#xff0c;所以我们学习还是尽量学习新的接口&#xff0c;QT使用**的5.8版本&#x…