资讯专栏INFORMATION COLUMN

优秀代码的必知必会(一)?

ChanceWong / 2386人阅读

摘要:但由于模式本身有严重的缺陷,由于构造方法在多次调用中被分割,导致可能处于不一致的状态,并且还需要额外增加工作以确保线程安全。方法必须遵从类指定的常规约定,将不同的哈希码分配给不同的实例对象。

1.使用静态工厂方法替代构造方法

静态工厂方法的优点:
不像构造方法,它是有名字的。
它不需要每次调用时都创建一个新对象。
它可以返回 其返回类型的任何子类型的对象。
返回对象的类可以根据输入参数的不同而不同。
在编写包含该方法的类时,返回的对象的类不需要存在。

2.当构造方法参数过多时请使用 builder 模式

当一个对象中,属性过多时,使用构造方法时,参数过多导致难以维护,并且很难读懂每个参数的含义是什么。

使用 构造方法 来构建必传参数,而用 setter 的方式来传可选参数呢?这看似参数少,创建实例也很容易,并且所生成的代码也易于阅读。但由于 JavaBeans 模式本身有严重的缺陷,由于构造方法在多次调用中被分割,导致 JavaBeans 可能处于不一致的状态,并且还需要额外增加工作以确保线程安全。

最好处理参数过多的方法是使用 builder 模式,它结合了可伸缩构造方法模式的安全性和 JavaBeans 模式的可读性,然后在调用 builder 对象的 setter 相似方法来设置每个可选参数。

3.使用依赖注入的方式注入资源

依赖注入的实践将极大地增强类的灵活性、可重用性和可测试性。

4.不要创建不必要的对象

如果对象是不可变的,它总是可以被重用的,比如 String 类是 final 的,不可变的,最好不要用 new String("test"), 因为它每次都会创建一个新的对象。在性能有严格要求的情况下,优先使用基本类型而不是装箱的基本类型,也要注意无意识的自动装箱,因为它们会影响性能。

5.消除过期的对象引用

这个也就是常说的内存泄露。当一个类自己管理内存时,应该警惕内存泄漏问题。 每当一个元素被释放时,元素中包含的任何对象引用都应该被清除。

另一个常见的内存泄漏来源是缓存。一旦将对象引用放入缓存中,很容易忘记它的存在,可以用 WeakHashMap 来表示缓存。

6.避免使用 Finalizer 和 Cleaner 机制,请使用 try-with-resources 语句

用于 Finalizer 和 Cleaner 机制的不确定性,我们不知道它到底何时会执行。例如,依赖于 Finalizer 和 Cleaner 机制来关闭文件是严重的错误,因为打开的文件描述符是有限的资源。 如果由于系统迟迟没有运行 Finalizer 和 Cleaner 机制而导致许多文件被打开,程序可能会失败,因为它不能再打开文件了。可以用 try-with-resources 语句 或 try-finally 语句,当打开多个文件时,try-finally 语句的可读性就不如 try-with-resources 语句,因此推荐使用 try-with-resources 语句。

7.重写 equals 方法时同时也要重写 hashcode 方法

重写 equals 方法时,需要满足以下特性。
自反性:一个对象必须与自身相等。
对称性:任何非空引用 x 和 y,如果且仅当 y.equals(x) 返回 true 时 x.equals(y) 必须返回 true。
传递性:如果第一个对象等于第二个对象,第二个对象等于第三个对象,那么第一个对象必须等于第三个对象。
一致性:如果两个对象是相等的,除非一个(或两个)对象被修改了, 那么它们必须始终保持相等。
非空性:对于任何非空引用 x,x.equals(null) 必须返回 false。

每次重写 equals 方法时都必须重写 hashCode 方法,否则程序将无法正常运行。 hashCode 方法必须遵从 Object 类指定的常规约定,将不同的哈希码分配给不同的实例对象。

8.始终重写 toString 方法

Object 类提供了 toString 方法的实现是包名+类名+@+哈希码的无符号十六进制。toString 的通用约定要求,返回的字符串应该是“一个简洁但内容丰富的表示,对人们来说是很容易阅读的”。就需要 toString 方法,方便可读性。

9.考虑实现 Comparable 接口

在需要可比较的场景中,最好实现 Comparable 接口,以便在基于比较的集合中轻松对其实例进行排序,搜索和使用。 比较 compareTo 方法的实现中的字段值时,请避免使用"<"和">"运算符。 最好使用包装类中的静态 compare 方法或 Comparator 接口中的构建方法。

10.使类和成员的可访问性最小化

一个优秀设计的组件隐藏了它的所有实现细节,干净地将它的 API 与它的实现分离开来。然后,组件只通过它们的 API 进行通信,并且对彼此的内部工作一无所知。称为信息隐藏或封装,是软件设计的基本原则。

Java中的四种访问级别:
private——只能自己访问。
package-private——默认级别,同包中的任意类访问。
protected——子类和自己可以访问。
public —— 任何类都可访问。

PS:
清山绿水始于尘,博学多识贵于勤。
我有酒,你有故事吗?
微信公众号:「清尘闲聊」。
欢迎一起谈天说地,聊代码。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74152.html

相关文章

  • 前端必必会HTTP请求系列(二)简单点的HTTP协议

    摘要:通过请求和响应的交换达成通信协议中已经规定了请求是从客户端发出,最后由服务端响应这个请求并返回。随后的字符串指明了请求访问的资源对象。协议自身不对请求和响应之间的通信状态进行保存,也就是说这个级别。从前发送请求后需等待并受到响应。 showImg(https://segmentfault.com/img/bVbmDsG?w=1024&h=538); http协议用户客户端和服务器之间的...

    xbynet 评论0 收藏0
  • 前端必必会HTTP请求系列(三)HTTP报文内的http信息

    摘要:报文用于协议交互的信息被称为报文。现在出现的各种首部字段及状态码稍后会阐述。状态码响应报文包含了多个范围的内容使用。如果服务器无法响应范围请求,则会返回状态码和完整的实体内容。 showImg(https://segmentfault.com/img/bVbthNL?w=900&h=500); http报文 用于HTTP协议交互的信息被称为HTTP报文。请求端的http报文叫做请求报文...

    Invoker 评论0 收藏0
  • 前端必必会HTTP请求系列()了解Web及网络基础

    摘要:诞生了在深入学习之前我们来了解一下他的背景,同时了解一下当时制定的初衷,这样有助于我们更好的理解。为知识共享而规划的在年月,互联网还只属于少数人,在互联网的前期,诞生了。的成长时代年月,成功研发了世界上第一台服务器和浏览器。 showImg(https://segmentfault.com/img/bVblTgr?w=800&h=400);在当前大前端的环境下,前后端分离,前后端同构等...

    qylost 评论0 收藏0

发表评论

0条评论

ChanceWong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<