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

一个好用的类的属性必须要隐藏起来,干净的将它与类的api分离开来,类之间只通过api相互使用,降低他们之间的耦合性。为了做到这一点,建议根据情况选择尽可能低的访问级别修饰符。

public 修饰不可变属性时(final修饰的属性)只是暴露的读权限,危害不是很大。但要注意的是,对于成员属性是对象的情况,不能在用final修饰后就认为危害很小了而用public修饰它,final修饰表示引用指向的对象不可变了,但根据引用取修改对象的内容是可以的。

16. 在公共类中使用访问方法而不是公共属性

大量使用的getter、setter方法就是符合这条原则,这样不仅将属性的读、写分开了,还可以在访问属性前做一些事、访问完属性后做一些事,要灵活的多。而不像公共属性,读写权限完全同时暴露,一旦被访问就是无条件被使用。

17. 最小化可变性

我们都知道String类一旦实例化后那这个对象的值是不可变的,是一个典型的最小化可变性的例子。除它之外,还有一众包装类:Integer、Double、Float.....都是将不可变性最小化的例子。他们都有如下特性:

(1)所有属性都是final修饰的不可变属性。如String类的 char[] 数组,用final修饰后就不能修改引用指向的数组

(2)所有属性都用private修饰。如String类的char [] 数组,这样就不能通过引用访问数组修改每个元素的内容

(3)类没有提供修改这些属性的方法。如String类的char[] 数组,用private修饰也没有对其的setter方法,保证了字符内容的不可变。

(4)在以上基础上,为了防止有子类恶意的继承并修改类的可变性,需要用final修饰类,设置为不可继承。

最小化类的可变性好处是:对象从创建后它的状态就永远不可能被改变,是天然线程安全的,可以被任意的共享。也有一些坏处:对于每一个值都需要创建一个新对象,不可以从旧对象的基础上修改而来。一般的,尽量将一个类的可变性最小化。

阅读《Effective Java》每条tips的理解和总结(2)(持续更新)的更多相关文章

  1. 阅读《Effective Java》每条tips的理解和总结(1)

    <Effective Java>这本书的结构是90来条tips,有长有短,每条tip都值的学习.这里根据对书中每条tip的理解做简短的总结,方便日后回顾.持续更新~ 1. 考虑用静态方法代 ...

  2. 金三银四:蚂蚁金服JAVA开发面试题及答案之一面(持续更新

    一面 1.自我介绍.自己做的项目和技术领域 开放题 2.项目中的监控:那个监控指标常见的有哪些? 答:CPU.内存.IO 等等.建议下载个nmon工具,里面有各个指标. 数据库:Mysql(缓存命中. ...

  3. java与C++相比增加和缺少的特性--持续更新

    缺少的特性 java值类型中没有无符号数 java没有运算符重载语法 java中没有struct和union等用户自定义值类型 java中没有虚函数的概念,所有函数默认具有虚函数的特性 java采用单 ...

  4. C#和Java在语法上的差异(原创,持续更新中)

    1.switch  C#一直支持String类型 Java直到1.7才支持 2.C#里String有Length属性 Java里是Length方法 3.C#中修饰class的sealed效果与Java ...

  5. 【技术累积】【点】【java】【8】maven常用命令(持续更新)

    建立 mvn archetype:generate -DgroupId=com.andy.test -DartifactId=test-project -Dversion=0.0.1-SNAPSHOT ...

  6. java实现顺序表、链表、栈 (x)->{持续更新}

    1.java实现节点 /** * 节点 * @luminous-xin * @param <T> */ public class Node<T> { T data; Node& ...

  7. Effective Java通俗理解(持续更新)

    这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...

  8. Effective Java通俗理解(下)

    Effective Java通俗理解(上) 第31条:用实例域代替序数 枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用 ...

  9. Effective Java通俗理解(上)

    这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...

随机推荐

  1. 原生JS去重

    方式一: function deleteRepetionChar(arr){ //先判断输入进来的是数组对象还是字符串 if( typeof arr == "object"){ v ...

  2. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_4 mybatis中使用unpooled配置连接池的原理分析

    把之前的CRUD的代码src下的代码都复制过来 依赖项也都复制过来, 配置文件 整理一番 执行findAll方法的测试 查看日志的输出部分 修改程序池 再来执行findAll方法 Plooled从连接 ...

  3. 阶段3 1.Mybatis_03.自定义Mybatis框架_5.自定义Mybatis的编码-创建两个默认实现类并分析类之间的关系

    把XMLConfigBuilder的包名补全 这样我们就可以调用里面的loadConfiguration方法了 创建工厂实现类 实现SqlSessionFactory的接口 实现接口里面的方法 把cf ...

  4. 八:flask-重定向示例

    现象:访问地址a,跳转到地址b,在flask中,使用redirect()来进行重定向 永久性重定向:301,多用于旧网址被废弃了,需要跳转到新网址访问 例如请求www.jingdong.com,会自动 ...

  5. jmeter之报告输出(html)

    在使用jmeter进行测试时,我们需要生成相应的测试报告,jmeter3.0之后有自带的测试报告. 在测试报告的格式和输出内容不满足需求时,我们可以根据需要去修改其配置文件(jmeter.proper ...

  6. 系统分析与设计HW5

    个人作业 领域建模 a. 阅读 Asg_RH 文档,按用例构建领域模型. 按 Task2 要求,请使用工具 UMLet,截图格式务必是 png 并控制尺寸 说明:请不要受 PCMEF 层次结构影响.你 ...

  7. PHP开发一个简单的成绩录入系统

    预览界面 源码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  8. 【Linux命令】解压相关命令

    xxx.tar.gz   :   tar xvzf xxx.tar.gz xxx.tar.bz2 :   tar -vxjf   xxx.tar.bz2

  9. kafka 安装教程

    安装详述: https://www.jianshu.com/p/596f107e901a 3.0:运行:cd 到: D:\Installed_software\Professional\kafka_2 ...

  10. HNUSTOJ-1437 无题

    1437: 无题 时间限制: 1 Sec  内存限制: 128 MB提交: 268  解决: 45[提交][状态][讨论版] 题目描述 tc在玩一个很无聊的游戏:每一次电脑都会给一个长度不超过10^5 ...