区分好的模块和不好的模块最重要的因素是看这个模块对于其他模块而言是否隐藏内部数据和其他细节。好的模块会把所有细节隐藏起来,把API和实现隔离开来,模块之间用API通信。这就是information hiding或者封装(encapsulation)。是软件设计基本原则之一。

information hiding最大的意义在于it decouples(解耦) the modules that comprise a system. 这样模块就能独立开发、测试。提高了可重用性

Java中很多facility协助了信息隐藏,比如访问控制access control,决定了类,接口,成员的accessibility。

The rule of thumb: **尽可能使每个类或者成员不被外界访问。**也就是给最小的访问级别。


顶层类和接口

Top level(non-nested)的classes and interfaces,只有两种可能的访问级别:

  • package-priavte(笔者注:也就是default) The member is accessible from any class in the package where it is declared
  • public

成员(fields, methods, nested classes, and nested interfaces)

  • private—The member is accessible only from the top-level class where it is declared.
  • package-private—The member is accessible from any class in the package where it is declared. Technically known as default access, this is the access level you get if no access modifier is specified.
  • protected—The member is accessible from subclasses of the class where it is declared (subject to a few restrictions [JLS, 6.6.2]) and from any class in the package where it is declared.
  • public—The member is accessible from anywhere.

  • 从package-private变成protected时,accessibility会大大增强。protected members应该尽量少用。

  • 子类中覆盖的方法的访问级别不能低于父类的那个。特别的,对于接口来说,接口中所有的方法都隐含着公有访问级别;所以如果一个类实现了接口,接口中所有方法在这个类中也必须被声明为公有的。

  • instance field永远不能是public的。 Classes with public mutable fields are not thread-safe. 这一点也就解释了之前我讨论的为什么android中的context不能写成 public static Context context;(当然对于android来说,private也不行,因为context不能是static)。这一点我还是不太明白,主要不明白instance field是啥,与之对应的static field是啥。

  • 同样的建议适用于静态域。

总之,防止任何散乱的类、接口、成员变成API的一部分。除了Public static final的特殊情形,public class都不应该含有public fields. 还要确保public static final域的对象都是不可变的,比如,不能定义一个public static final Things[] VALUES = {...};因为非0数组是可变的。

转载于:https://juejin.im/post/5a31341851882535cd4ad56a

Item 13 Minimize the accessibility of classes and members相关推荐

  1. Item 13: Prefer const_iterators to iterators.

    Item 13: Prefer const_iterators to iterators. Effective Modern C++ Item 13 的学习和解读. STL 中 const_itera ...

  2. Item 13: 比起iterator优先使用const_iterator

    本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 STL中的const_iterator等价于poi ...

  3. EffectiveJava(v3) - chapter3: Classes and Interfaces

    Classes and Interfaces 类和接口是Java编程中的核心, 提供了基础的抽象模块. 本章专注于如何使用类和接口来实现强壮的, 灵活的, 高可用的代码. Introduce Effe ...

  4. Effective C# 原则13:用静态构造函数初始化类的静态成员(译)

    Effective C# 原则13:用静态构造函数初始化类的静态成员 Item 13: Initialize Static Class Members with Static Constructors ...

  5. 读书笔记 effective c++ Item 49 理解new-handler的行为

    1. new-handler介绍 当操作符new不能满足内存分配请求的时候,它就会抛出异常.很久之前,它会返回一个null指针,一些旧的编译器仍然会这么做.你仍然会看到这种旧行为,但是我会把关于它的讨 ...

  6. 读书笔记 effective c++ Item 18 使接口容易被正确使用,不容易被误用

    1. 什么样的接口才是好的接口 C++中充斥着接口:函数接口,类接口,模板接口.每个接口都是客户同你的代码进行交互的一种方法.假设你正在面对的是一些"讲道理"的人员,这些客户尝试把 ...

  7. 《C++ Templates》笔记 Chapter 12 Fundamentals in Depth-Chapter 13 Names in Templates

    文章目录 Chapter 12 Fundamentals in Depth 12.1 Parameterized Declarations 12.1.1 Virtual Member Function ...

  8. 2000个软件开发领域的高频特殊词及精选例句

    1101.单词 uuids 的匹配文本: For example, when accessing /_uuids, you get a list of UUIDs from the system. G ...

  9. Effective C++读书摘要--Implementations二

    <Item29> Strive for exception-safe code. 1.如下面的代码 class PrettyMenu { public:...void changeBack ...

最新文章

  1. css3 高度最小100%,100%最小高度CSS布局
  2. Spring的Java配置方式
  3. dns服务器zones文件,DNS服务安装与配置
  4. disconf(二):服务端使用总结
  5. 自定义构建基于.net core 的基础镜像
  6. 【Django】基于Django架构网站代码的目录结构
  7. dataframe转字典dict格式
  8. 创作高水准的 3D 作品,苹果Mac设计师必备的4款3D软件
  9. 数据分析---统计学基础知识
  10. springcloud 01 euraka整理
  11. 计算机开机跳过硬盘检查,怎样取消电脑开机磁盘自检 关闭硬盘自检方法全析...
  12. android实现推箱子代码,android开发--推箱子小游戏(二)
  13. 编译原理逆波兰式实验java_【实验三】—— 逆波兰式生成实验报告
  14. 华为魔术2手机拆机图解_荣耀Magic2做工如何?荣耀Magic2拆解图解评测 (全文)
  15. 向 Dockerfile 传参 --build-arg 遇到的一些小坑
  16. Windows 优质软件
  17. 简单好听的id_简单好听的贴吧id名字大全
  18. html text-decoration,text-decoration 属性
  19. R软件R2WinBUGS程序包在网状Meta分析中的应用
  20. 硬件开发——语音模块开发 (包含语音识别模块代码等资料包 )

热门文章

  1. 机器视觉技术及应用_工业机器人视觉技术的应用前景
  2. 在计算机管理中创建不同的用户,为什么在计算机管理员里创建密码密码总是不符合要求...
  3. java jndi tcp_spring配置下通过tomcat的jndi服务连接数据库
  4. go 生成hash_go基础之map-写在前面(一)
  5. 笔记本连接显示器后没有声音_电脑用HDMI外界显示器后,没有声音
  6. 七年级上册计算机工作计划,清华大学版信息技术七年级上册学期教学工作计划...
  7. retrofit 2.0 android 教程,初识Retrofit2.0
  8. Eclipse 答疑:如何使用 Eclipse 进行断点(Breakpoints)调试?
  9. java 先入先出,java_阻塞队列(FIFO先进先出)
  10. JavaBean和Servlet