简介:“有效的Java”是一本经典的Java学习书,值得阅读每个Java开发人员。
“有效Java”是一本经典的Java学习书,值得为每个Java开发人员阅读。
1如果有多个构造函数参数,则将构造函数优先
当类结构包含多个参数时,学生将选择Javabeans模式。在此模式下,您可以调用构造函数以创建对象,然后调用setter方法来设置必要的可选参数。一种更流行的方法之一是添加Lombok在类上提供的@DATA注释,该方法来自诸如Getter/Setter,Equals等方法。要求开发人员控制自己的价值的价值,以确保线程安全。
推荐:建筑商模式
构建器模式调用类似于构建器对象上的setter的方法,通过调用构建方法来生成不称职的对象(不可变的对象),以相关的参数(类似于原始缓冲区)。使用构建器模式的方法之一。包括Lombok在班上提供的@Builder注释。
应用程序:API请求和响应
在微服务架构中,服务的请求(请求)和响应通常包括更多参数。在处理请求的过程中,作者经常担心请求的内容会错误地修改请求。因此,作者倾向于使用建筑商模式。
我们可以使用构建器模式来构建此类型对象。在构造过程中,如果您需要引入其他逻辑(例如,如果是ART),则可以先返回构建器对象,最后调用构建方法。
2增强无法通过私人构造函数实例化的能力
某些类,例如公用事业类,仅包含静态字段和静态方法。这些类应试图确保它们不会实例化以防止用户滥用。
建议:私有化构造函数
为了防止误导用户,我们认为该类是专门为继承而设计的,我们可以将构造函数私有化。
1最小化班级和会员的可访问性
使每个班级或成员尽可能访问。
建议:有时,为了进行测试,我们必须将一些私人(私人),接口或成员转换为数据包 - 私人。为了使访问级别成为私人所有者并放松限制。
此外,一些朋友推荐PowerMock单元测试框架。PowerMock是Mockito的增强版本,可以通过添加@preparefortest注释来完成私有//静态/最终方法的模拟(仿真)。
2最小化变形
不变的类意味着在创建相应的实例之后,它不能更改其成员变量值,也就是说,在创建此实例并固定在对象的生命周期中时,必须提供实例中包含的所有信息。
不现实的类通常采用函数(功能)模式,即相应的方法返回函数的结果。该函数由操作编号计算,但不会对其进行修改。相应地,更常见的是过程或命令方法。当使用这些方法时,对其操作行动的过程将导致其状态发生变化。
例如,在“如果有多个构造函数参数(首选)构造函数”的部分中,提到非变换对象很简单,线程很安全,只有一个状态。使用此类的开发人员不需要在加上额外的工作中,做其他工作。加上可变对象可能是任意复杂的。如果突变器方法(例如更新)没有详细的描述,则开发人员需要自己读取方法内容。作者经常花更多的时间来找出哪个可变对象的字段以某种方法更改。该方法结束后它会影响后续对象操作吗?作者建议引入不变的对象,并根据此更新的参数返回新的不可控制的对象。尽管将创建更多对象,但可以保证它不是转变,更可读。
推荐:不变的番石榴系列
在日常发展中,作者倾向于将不可变化主义者(不可投射,不可投射,不可能)和上面提到的功能模式提出,以实现突变器类方法。
数组中首选1个列表
阵列是协调的(协变),即,子的子类型是超级,然后阵列类型sub []是super []的子型;阵列是具体的,并且在运行时已知并检查了元素类型的约束。通用类型不变且橡皮擦(也就是说,在编译过程中加强其类型信息并在运行时丢弃)。
需要警惕公共静态最终数组的出现。这可能是一个安全漏洞!
1验证参数的有效性
如果传递无效的参数值,此方法将在执行复杂和时间耗尽逻辑之前检查参数,并且很快就会失败并明显地抛出适当的异常。没有验证其参数,将来可能会发生各种奇怪的异常,有时很难检查定位的原因。
作者认为,微服务提供的API请求也应使用此想法。也就是说,在API请求服务处理之前,参数检查可用。,抛出特定的客户端评估(例如,iLlegalArgumentedException)。
2请仔细设计方法签名
3返回零长度阵列或设置,而不是null
如果方法返回null而不是零长度阵列或集合,则需要加入开发人员!= null的检查,有时很容易忘记错误,并将其报告给NullPoInterException。
说到哪个,我想提及可选的。在互联网上进行了许多有关可选和空的讨论。选项允许呼叫者继续一系列平滑的方法调用(例如stream.getFirst()。orelsethrow((() - > new MyFancyException())。以下是作者的观点。
1如果您需要准确的答案,请避免使用浮点并双倍
浮点和双重类型主要用于科学工程计算。它们执行二进制浮动点操作,以提供更准确和快速的计算近似值,以便在数值范围内提供更准确和快速的近似计算。准确的结果,尤其是不适合货币计算。Float或Double准确地表明0.1不可行。
如果系统需要记录小数点小数点,则可以使用BigDecimal。
2种基本类型在基本包装中首选
基本类型,例如int,double,long和boolean。每个基本类型具有相应的参考类型,称为盒装原始类型,与整数,double,long和boolean相对应。如书中所述,它们的差异如下:
如果没有特殊用途方案,建议使用基本类型。如果您必须使用基本的包装类型,请注意==操作和nullpointerexception.basic的使用类型:拳击的使用类型:
1每种方法抛出的异常必须具有文档
始终声明异常检查,并使用Javadoc的@throws标记准确记录每个异常情况。
在日常工作中,当作者调用其他小组的API时,有时会发现一些意外的异常。良好的文档记录可以帮助API卡路里更好地处理相关的异常。文件记录可以包括:异常类型,异常错误代码和描述。
其他2个
一些公司将API产生的异常分为clienexception和serverException.General ClientException(例如,无效的服务请求)是由呼叫方的非常规API引起的异常处理,这不是在服务器的主要异常监控范围内。数据库查询超时)是服务器本身引起的问题,通常需要专注于监视。
约书亚的街区。2018.有效Java,第三版原始链接
作者|yiqiu来源|阿里技术公共帐户