面向对象

01、构造器参数太多怎么办?

如果参数很多,会导致构造方法非常多,拓展性差,代码难编写,且难以看懂。

用JavaBeans模式,

get和set

一行构造编程多行代码实现,需要使用额外机制确保一致性和线程安全。

用builder模式,

1、5个或者5个以上的成员变量

2、参数不多,但是在未来,参数会增加

Builder模式:

属于对象的创建模式,一般有

1、 抽象建造者:一般来说是个接口,包含1)建造方法,建造部件的方法(不止一个),2)返回产品的方法

2、 具体建造者

3、 导演者,调用具体的建造者,创建产品对象

4、 产品,需要建造的复杂对象

对于客户端,创建导演者和具体建造者,并把具体建造者交给导演者,然后由客户端通知导演者操纵建造者进行产品的创建。

在实际的应用过程中,有时会省略抽象建造者和导演者。

优势:如果当大多数参数是可选时,代码易于阅读和编写,比JavaBean更加安全。

02、不需要实例化的类应该构造器私有

如,一些工具类提供的都是静态方法,这些类是不应该提供具体的实例的。可以参考JDK中的Arrays。

好处:防止使用者new出多个实例。

03、不要创建不必要的对象

1、 避免无意中创建的对象,如自动装箱

可以在类的多个实例之间重用的成员变量,尽量使用static。

性能对比。

但是,要记住,是不要创建不必要的对象,而不是不要创建对象。

对象池要谨慎使用,除非创建的对象是非常昂贵的操作,如数据库的连接,巨型对象等等。

04、避免使用终结方法

finalizer方法,jdk不能保证何时执行,也不能保证一定会执行。如果有确实要释放的资源应该用try/finally。

05、使类和成员的可访问性最小化

模块对外部其他模块来说,隐藏其内部数据和其他实现细节——封装

编写程序和设计架构,最重要的目标之一就是模块之间的解耦。使类和成员的可访问性最小化无疑是有效的途径之一。

类似于微服务,

06、使可变性最小化

尽量使类不可变,不可变的类比可变的类更加易于设计、实现和使用,而且更不容易出错,更安全。

常用的手段:

不提供任何可以修改对象状态的方法;

使所有的域都是final的。

使所有的域都是私有的。

使用写时复制机制。并发编程中已讲。

07、复合优先于继承

继承容易破坏封装性,而且会使子类的实现依赖于父类。

复合则是在类中增加一个私有域,引用类的一个实例,这样的话就避免了依赖类的具体实现。

只有在子类确实是父类的一个子类型时,才比较适合用继承。

继承需要开发者对父类的结构有一定了解。

实际使用,如果肯定是父类的子类,使用继承,如果不很肯定,使用复合。

08、接口优于抽象类

接口只有方法申明,抽象类可以写方法的实现。

java是个单继承的(不能继承多个抽象类),但是类允许实现多个接口。

所以当发生业务变化时,新增接口,实现接口只需要新曾接口即可。但是抽象类有可能导致不需要变化的类也不得不实现新增的业务方法。

JDK源码中常用的一种设计方法:定义一个接口,声明一个抽象的骨架类实现接口,骨架类类实现通用的方法,而实际的业务类可以同时实现接口又继承骨架类,也可以只实现接口。

如HashSet实现了implements Set接口 但是又extends 类AbstractSet,而AbstractSet本身也实现了Set接口。其他如Map,List都是这样的设计的。

方法

09、可变参数要谨慎使用

可变参数是允许传0个参数的

如果是参数个数在1~多个之间的时候,要做单独的业务控制。

具体代码不优雅。

10、返回零长度的数组或集合,不要返回null

方法的结果返回null,会导致调用方的要单独处理为null的情况。返回零长度,调用方可以统一处理,如使用foreach即可。

JDK中也为我们提供了Collections.EMPTY_LIST这样的零长度集合

11、优先使用标准的异常

要尽量追求代码的重用,同时减少类加载的数目,提高类装载的性能。

常用的异常:

IllegalArgumentException    -- 调用者传递的参数不合适

IllegalStateException    -- 接收的对象状态不对,

NullPointerException

UnsupportedOperationException  –不支持的操作

通用程序设计

12、用枚举代替int常量

声明的一个枚举本质就是一个类,每个具体的枚举值就是这个枚举类的实例。

  1. 使用常量容易在写代码时写错
  2. 使用常量如果要使用描述时比较麻烦
  3. 其他类使用常量时,类编译时会把常量值直接写到字节码中,如果常量值有变化,所有相关的类需要重新编译,否则会不可预料的错误

枚举高级:

枚举和行为绑定

所谓枚举的本质就是一个类,而枚举中定义的每一个具体的枚举类型其实就是这个枚举类的一个实例。

策略枚举:

13、将局部变量的作用域最小化

1、 在第一次使用的地方进行声明

2、 局部变量都是要自行初始化,初始化条件不满足,就不要声明

最小化的好处,减小局部变量表的大小,提高性能;同时避免局部变量过早声明导致不正确的使用。

14、精确计算,避免使用float和double

float和double在JVM存储的时候,有部分要做整数位,有部分要做小数位,所以存在精度上的问题

可以使用int或者long以及BigDecimal

15、当心字符串连接的性能

参考代码com.jvm.ch07.p15.Test。

在存在大量字符串拼接或者大型字符串拼接的时候,尽量使用StringBuilder和StringBuffer

16、控制方法的大小

编写高效优雅Java程序的更多相关文章

  1. 搭建java开发环境、使用eclipse编写第一个java程序

    搭建java开发环境.使用eclipse编写第一个java程序 一.Java 开发环境的搭建 1.首先安装java SDK(简称JDK). 点击可执行文件 jdk-6u24-windows-i586. ...

  2. 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化

    C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...

  3. 【安装eclipse, 配置java环境教程】 编写第一个java程序

    写java通常用eclipse编写,还有一款编辑器比较流行叫IJ.这里我们只说下eclipse编写java的前期工作. 在安装eclipse之前要下载java的sdk文件,即java SE:否则无法运 ...

  4. 从零自学Java-1.编写第一个Java程序

    编写第一个Java程序 完成工作:1.在文本编辑器中输入一个Java程序. 2.使用括号组织程序. 3.保存.编译和运行程序. package com.Jsample;//将程序的包名称命名为com. ...

  5. Java笔记:编写第一个Java程序

    2017.6.17 1.编写第一个Java程序 创建text文本,命名第一个Java程序.txt 在里面编写Java代码 public class Demo1{ public static void ...

  6. 假期作业02:安装JDK与文本编辑器并编写第一个Java程序

    假期作业02:安装JDK与文本编辑器并编写第一个Java程序 一.安装JDK与文本编辑器并编写第一个java程序 首先在oracle官网(需要创建账号,进行登录后方可使用)按照自己的需求下载JDK(h ...

  7. unbutu中安装jdk并编写第一个java程序

    第一部分:安装jdk 1.首先在putty控制台中输入如下命令,检验系统中是否已经装有jdk. java -version 如果显式的结果如下图,则说明没有安装. openjdk是在linux下默认安 ...

  8. 编写高效的JavaScript程序

    作者: Addy Osmani  来源: CSDN  发布时间: 2013-01-10 14:15  阅读: 7952 次  推荐: 15   原文链接   [收藏] 英文原文:Writing Fas ...

  9. 使用eclipse编写和运行java程序(基础)

    1.首先java程序的运行你需要下载和安装JDK,这是java运行的必备环境. 2.在桌面上找到eclipes,双击打开. 3.在eclipes启动的过程中,会弹出一个窗口,让你填写java工作区的保 ...

随机推荐

  1. Redis服务之Redis5集群相关命令说明

    上一篇博客主要聊了下redis.trib.rb这个工具来管理redis3/4 cluster 中的节点,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13456 ...

  2. sourcetree关于注册的问题

    当前只有Win的版本,Mac自行百度(笑) 很多人用git命令行不熟练,那么可以尝试使用sourcetree进行操作. 然鹅~~sourcetree又一个比较严肃的问题就是,很多人不会跳过注册或者操作 ...

  3. 图论算法(四)Dijkstra算法

    最短路算法(三)Dijkstra算法 PS:因为这两天忙着写GTMD segment_tree,所以博客可能是seg+图论混搭着来,另外segment_tree的基本知识就懒得整理了-- Part 1 ...

  4. Autocad.net利用Xaml创建Ribbon界面

    0.Ribbon界面 Ribbon界面设计语言最早于Office 2007出现,后来逐渐被其他Windows系统组件采用,一些专业软件也开始以Ribbon界面取代传统菜单栏设计.Ribbon设计语言显 ...

  5. jQuery css()方法及方法

    知识点一:jQuery css()方法 1.css()方法是什么? css()方法设置或返回被选元素的一个或多个样式属性. 2.返回CSS属性 1.$("p").css(" ...

  6. PythonCrashCourse 第四章习题

    Python 从入门到实践第四章习题 4.1想出至少三种你喜欢的比萨,将其名称存储在一个列表中,再使用for 循环将每种比萨的名称都打印出来 修改这个for 循环,使其打印包含比萨名称的句子,而不仅仅 ...

  7. 微信DLL劫持反弹shell复现

    (该文参考网络他人资料,仅为学习,不许用于非法用途) 一.操作环境 Windows7 :  微信  , Process Explorer(任务管理工具,本实验中用于查找微信程序调用的DLL文件) Ka ...

  8. yum安装软件时,提示No package netstat available.的解决方法

    1. 序言 如笔者在本机上运行netstat时,提示没有这个命令,向来简单粗暴,直接yum -y install netstat,显然是不能正常安装的. [root@hadoop-103 ~]# yu ...

  9. Navicat15破解+网盘位置

    百度网盘Navicat.15位置 链接:https://pan.baidu.com/s/1Vn0Qnt8IUA37a-p4hAnk5g 提取码:clq3 1.百度网盘下载完后,点这个安装Navicat ...

  10. Devops与敏捷二者能否结合?

    当前软件行业的趋势倾向于使应用程序开发和部署成为业务运营的重要组成部分.这些公司开始专注于实现像DevOps解决方案这样的方法,这有助于缩短产品开发时间.使用DevOps进行开发减少了交付软件所需的阶 ...