第13条:使类和成员的可访问性最小化:
实例域决不能是公有的。如果域是非final的,或者指向的是一个可变对象的final引用,那么一旦这个实例域变成公有,这个公有域就不是线程安全的了,很有可能出问题。
第14条:在公有类中使用访问方法而非公有域
第15条:使可变性最小化:
为了使类成为不可变,遵循下面5条原则:
* 不要提供任何会修改对象状态的方法 mutator
* 保证类不会被扩展,可将类声明为final,或者是将所有构造器变为私有或者包级私有,并添加静态工厂方法。
* 所有域都是final,并且是private的
* 确保对于任何可变组件的互斥访问
public final class Complex { private final double re; private final double im; private Complex(double re, double im) { this.re = re; this.im = im; } public static Complex valueOf(double re, double im) { return new Complex(re, im); } public static Complex valueOfPolar(double r, double theta) { return new Complex(r * Math.cos(theta), r * Math.sin(theta)); } }
第16条:复合优于继承:
只有当子类和超类确实存在is-a的关系的时候才用继承,其他一律用组合。
第17条:要么为继承而设计,并提供文档说明,要么就禁止继承:
为了允许继承,构造器绝对不能调用可被覆盖的方法。
第18条:接口优于抽象类:
第19条:接口只用于定义类型:
常量接口模式是对接口的不良使用。
如果要导出常量,有几种合理的方案:
* 如果这些常量与某个现有类或者接口紧密相关,就应该把这些常量添加到这个类或者接口中。
* 如果这些常量最好被看做枚举类型成员,就应该用枚举类型 enum type来导出这些常量。
* 如果是其他情况,则应该使用不可实例化的工具类utility class来导出这些常量。
public class PhysicalConstants { private PhysicalConstants() { } // Prevents instantiation // Avogadro's number (1/mol) public static final double AVOGADROS_NUMBER = 6.02214199e23; // Boltzmann constant (J/K) public static final double BOLTZMANN_CONSTANT = 1.3806503e-23; // Mass of the electron (kg) public static final double ELECTRON_MASS = 9.10938188e-31; }
简而言之:接口应该只是用来定义类型,它们不应该被用来导出常量。
第20条:类层次优于标签类:
第21条:用函数对象表示策略:
第22条:优先考虑静态成员类:
本人博客已搬家,新地址为:http://yidao620c.github.io/
相关推荐
目录:一、创建和销毁对象 (1 ~ 7)二、对于所有对象都通用的方法 (8 ~ 12)三、类和接口 (13 ~ 22)四、泛型 (23 ~ 29)五、枚举和注解 (30 ~ 37)六、方法 (38 ~ 44)七、通用程序设计 (45 ~ 56)八、异常 ...
java逻辑思维笔试题Effective Java - 第三版笔记 章节索引 02 - 创建和销毁对象 03 - 所有对象通用的方法 04 - 类和接口 05 - 泛型 06 - 枚举和注释 07 - Lambda 和流 08 - 方法 09 - 通用编程 10 - 例外 11 - 并发 ...
有人说C++程序员可以分成两类,读过Effective C++的和没读过的。世界顶级C++大师Scott Meyers成名之作的第三版的确当得起这样的评价。当您读过《Effective C++中文版(第3版改善程序与设计的55个具体做法)》后,就...
对于顶级(非嵌套)类和接口,只有两种可能的访问级别:包私有和公共。 如果包私有的顶级类或接口仅被一个类使用,请考虑使顶级类成为使用它的唯一类的私有静态嵌套类 成员(字段、方法、嵌套类和嵌套接口) 修饰符 ...
前者是Collection层次结构中的根接口,而“Collections”是一个提供静态方法来处理某些Collection类型的类。 3. 单例属性 单例模式: 保持构造器私有【private】,并导出【提供外界访问】公有的静态成员 客户端...
java8集合源码有效的 Kotlin - 示例 免责声明:这个存储库包含我在阅读优秀书籍 Effective Kotlin 时收集的个人笔记和示例。 它绝不是本书的摘录或副本。 我鼓励所有 Kotlin 开发人员购买和阅读这本书。 第 1 部分:...
声明时应养成这样的习惯:// Good - uses interface as typeSet<Son> sonSet = new LinkedHashSet
结合唯品会的内部经验,参考《阿里巴巴Java开发手册》《Clean Code》、《Effective Java》等重磅资料进行了大幅定制,包含核心基础类库VJKit ,问题排查工具VJMap 和 VJTop 三部分。 开发工具在软件开发生命周期中...
Java基础、Java内存模型、Java面向对象、Java集合体系、接口、Lambda表达式、类加载机制、内部类、代理类、Java并发、JVM、Java后端编译、Spring 3. Go defer底层原理、goroutine、select实现机制 4. 算法学习 数组...
安装后重启,在Settings中找到和选中FindBugs-IDEA选项,在Plugins中勾选Findbugs plugin for Android启用Android的代码检查,在Filter里Exclude filter files中添加项目根目录下的findbugs-android-exclude.xml,这...
深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...
HybridApp 一种可以下载的Native App,其用户界面的全部或者部分元素在嵌入式浏览器组件(WebView之类的)里面运行 优雅降级 一开始就构建站点的完整功能,然后针对浏览器测试和修复。认为应该针对那些最高级、最...