网站首页 > java教程 正文
简洁清晰,可读性强,还具备一定的容错能力的代码作品是每位程序员的追求。今天,结合我以往踩过的坑,为大家带来编程方面的几点建议和技巧,以帮助大家编写出简洁、干练的Java代码。
面向对象
1. 构造器参数太多怎么办?
用 builder 模式,用在
(1)5 个或者 5 个以上的成员变量
(2)参数不多,但是在未来,参数会增加
2. 不需要实例化的类应该构造器私有
如,一些工具类提供的都是静态方法,这些类是不应该提供具体的实例的。可以参考JDK中的 Arrays。
3.不要创建不必要的对象
(1) 避免无意中创建的对象,如自动装箱。
(2) 可以在类的多个实例之间重用的成员变量,尽量使用 static。
但是,要记住,是不要创建 不必要的对象,而不是不要创建对象。对象池要谨慎使用,除非创建的对象是非常昂贵的操作,如数据库的连接,巨型对象等等。
4.避免使用终结方法
finalizer 方法,jdk 不能保证何时执行,也不能保证一定会执行。如果有确实要释放的资源应该用 try/finally。
5.使类和成员的可访问性最小化
编写程序和设计架构,最重要的目标之一就是模块之间的解耦。使类和成员的可访问性最小化无疑是有效的途径之一。
6.使可变性最小化
尽量使类不可变,不可变的类比可变的类更加易于设计、实现和使用,而且更不容易出错,更安全。
常用的手段:
不提供任何可以修改对象状态的方法;
使所有的域都是 final 的。
使所有的域都是私有的。
使用写时复制机制。带来的问题:会导致系统产生大量的对象,而且性能有一定的影响,需要在使用过程中小心权衡。
7.复合优先于继承
继承容易破坏封装性,而且会使子类的实现依赖于父类。
复合则是在类中增加一个私有域,引用类的一个实例,这样的话就避免了依赖类的具体实现。只有在子类确实是父类的一个子类型时,才比较适合用继承。
8.接口优于抽象类
java 是个单继承的,但是类允许实现多个接口。
所以当发生业务变化时,新增接口,并且需要进行业务变化的类现新接口即可。但是抽象类有可能导致不需要变化的类也不得不实现新增的业务方法。
在 JDK 里常用的一种设计方法是:定义一个接口,声明一个抽象的骨架类实现接口,骨架类类实现通用的方法,而实际的业务类可以同时实现接口又继承骨架类,也可以只实现接口。
如 HashSet 实现了 implements Set 接口 但是又 extends 类 AbstractSet,而AbstractSet 本身也实现了 Set 接口。其他如 Map,List 都是这样的设计的。
方法
1.可变参数要谨慎使用
可变参数是允许传 0 个参数的,如果是参数个数在 1~多个之间的时候,要做单独的业务控制。
2.返回零长度的数组或集合,不要返回 null
方法的结果返回 null,会导致调用方的要单独处理为 null 的情况。返回零长度,调用方可以统一处理,如使用 foreach 即可。
JDK 中也为我们提供了 Collections.EMPTY_LIST 这样的零长度集合。
3.优先使用标准的异常
要尽量追求代码的重用,同时减少类加载的数目,提高类装载的性能。
常用的异常:
IlegalAraumentException -- 调用者传递的参数不合适
lllegalStateException – 接收的对象状态不对,
NullPoint
UnsupportedOperationException –不支持的操作
通用程序设计
1.用枚举代替 int
声明的一个枚举本质就是一个类,每个具体的枚举值就是这个枚举类的实例。
2.将局部变量的作用域最小化
(1) 在第一次使用的地方进行声明
(2) 局部变量都是要自行初始化,初始化条件不满足,就不要声明最小化的好处,减小局部变量表的大小,提示性能;同时避免局部变量过早声明导致不正确的使用。
3.精确计算,避免使用 float 和 和 double
可以使用 int 或者 long 以及 BigDecimal。
4.当心字符串连接的性能
在存在大量字符串拼接或者大型字符串拼接的时候,尽量使用 StringBuilder 和StringBuffer 。
* 声明:资料等作品均来源互联网,版权归该资源的合法拥有者所有,分享的资料仅供读者预览及学习交流使用。禁止商业使用。原作者如果认为本文侵犯了您的版权,请联系本号立即删除!
猜你喜欢
- 2024-10-06 Java基础——第一个Java程序(第一个java程序的几个步骤)
- 2024-10-06 创建第一个Java程序(编写第一个java程序)
- 2024-10-06 Windows脚本用于启停Java应用程序JAR包,并具备日志输出功能
- 2024-10-06 超详细的Java学习路线清单,拥有了这套资源,即可快速进阶Java
- 2024-10-06 Java实用教程-Java基本语法-Java程序的构成
- 2024-10-06 好程序员Java教程分享Java的运行机制是什么
- 2024-10-06 Java程序开发的三个步骤(java程序开发的三个步骤是)
- 2024-10-06 Java基础知识点(java基础知识点面试题)
- 2024-10-06 学习第一个Java程序(java第一阶段要学的知识)
- 2024-10-06 JAVA学习基础之简单JAVA 程序(java入门编程教程)
你 发表评论:
欢迎- 最近发表
-
- 你真的会用 Java 中的线程池吗?多个企业级线程池工具类封装实践
- 线程池的实现原理、优点与风险、以及四种线程池实现
- Java线程池ThreadPoolExecutor实现原理剖析
- 深入分析线程池的实现原理(线程池是干嘛的)
- 一文搞懂JAVA线程池工作原理(java线程池的工作流程)
- Java线程池的工作原理(java线程池的实现原理)
- 5分钟读懂C#中TcpClient、TcpListener和Socket三个类的角色
- JVM对象的创建过程(jvm运行过程中创建的对象一般存放在方法区)
- 对象组成与Java内存模型JMM分析(java对象在内存中存储的结构)
- JVM对象内存分配详细过程(栈上分配->TLAB->老年代->Eden区)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)