最小化类和成员的访问能力

原文地址:http://leihuang.org/2014/11/17/minmize-accessibility/

信息隐藏

要想区别一个设计良好的模块与一个设计不好的模块,最重要的因素是,这个模块对于外部的其它模块而言,是否隐藏了内部的数据和其他的实现细节。换句话说,就是模块的设计者是否对其进行了良好的封装。

对于顶层的(非嵌套的)类和接口,它们只有2种访问级别:包级私有(package-private)和公有(public)。如果选择了包级私有,那么它只是这个包的实现的一部分,而不是该包对外提供服务的API的一部分。在以后的版本中,你可以对它进行修改、替换甚至删除,而无需担心会伤害到现有的使用者。而如果选择的公有的,你就有义务永远支持它,以保持兼容性。

对于成员(域和方法),访问级别共为4种:

● 私有的(private)——只有该成员的顶层类中才能访问

● 保护的(protected)——本包内的任何类和所在类的子类都可以访问

● 公有的(public)——任何地方都可以访问

实例域不能为public

如果一个实例域时final,或者是一个指向可变对象的final引用,如果你将这样的类申明为public。那么你就不能限制存在这个域里面的值,也不能强制这些数据不变。同时,实例域被修改时你也不能做些什么,所以:

classes with public mutable fields are not thread-safe.

具有公有的静态final数组域几乎总是错误的。注意这句话共有4个定语——公有的、静态的、final的、数组。

// 这可以肯定是错误的
public static final Type[] VALUES = { ... };  

// 应该改成这样
private static final Type[] PRIVATE_VALUES = { ... };
public static final List VALUE = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));

// 或者这样写(可能损失一点性能),前提是Type实现了克隆接口,而且你不反感克隆
private static final Type[] PRIVATE_VALUES = { ... };
 public static final Type[] values() {
      return (Type[]) PRIVATE_VALUES.clone();
 }


2014-11-17 00:48:43

Brave,Happy,Thanksgiving !

时间: 2024-12-12 15:10:55

最小化类和成员的访问能力的相关文章

《Effective Java》读书笔记 - 最小化类的可变性

Item 15 最小化类的可变性 effective java 如何做到让类不可变? 不提供改变对象状态的方法.(mutators) 确保类不会被继承,即用final来限定类. 让所有的域(field)为final. 让所有的域private. 确保所有对可变组件的互斥访问(Ensure exclusive access to any mutable components) 例子: public final class Complex{ //final class private final d

类的集成,对基类私有成员的访问

派生类不能直接访问基类的私有成员,若要访问必须使用基类的接口,即通过其成员函数.实现方法有如下两种: 1.在基类的声明中增加保护成员,将基类中提供给派生类访问的私有成员定义为保护成员.2.将需要访问基类私有成员的派生类成员函数声明为友元. #include<iostream> using namespace std; class Base {       friend class Derived2;//friend       int x;       protected://protecte

第13条:使类和成员的可访问性最小化

区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.设计良好的模块会隐藏所有的实现细节,把它的API于它的实现清晰地隔离开来.然后,模块之间通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念称为信息隐藏或封装.使类和成员的可访问性最小化可以有效的解除系统中各个模块的耦合度.实现每个模块的独立开发.使得系统更加的可维护,更加的健壮.对于顶层的(非嵌套的)类和接口,只有两种可能的访问级别,包级私有的和公有的

Java类和类成员的访问权限修饰符

一:访问修饰符: 1.省略访问修饰符 具有默认的访问特性,即具有包访问特性,只能被同一个包中的类使用. 2.public访问修饰符 用于说明类和类的成员的访问权限.这种类叫公有类.在一个文件中只能有一个public类型的类. 例如:Rect和UseImport两个类,分别在两个不同的包中.顺便回顾一下不同类要用import导入.(哎,一直就没记住) //Rect.java pacakage my; public class Rect { private int a,b; public void

02-25类成员的访问权限

面向对象编程的一大特性就是可以控制类成员的可访问性.当前主流的面向对象语言都拥有以下三种基本的可访问性. 1)公有:public 访问不受限制 2)私有:private 只有类自身成员可访问 3)保护:protected 子类可以访问,其他类无法访问 (1)public和private public和private主要用于单个类的成员存取权限. 1 class A 2 { 3 public int publicI; 4 private int privateI; 5 protected int

C++派生类成员的访问属性

既然派生类中包含基类成员和派生类自己增加的成员,就产生了这两部分成员的关系和访问属性的问题.在建立派生类的时候,并不是简单地把基类的私有成员直接作为派生类的私有成员,把基类的公用成员直接作为派生类的公用成员. 实际上,对基类成员和派生类自己增加的成员是按不同的原则处理的.具体说,在讨论访问属性时,要考虑以下几种情况: 基类的成员函数访问基类成员. 派生类的成员函数访问派生类自己增加的成员. 基类的成员函数访问派生类的成员. 派生类的成员函数访问基类的成员. 在派生类外访问派生类的成员. 在派生类

C#类、方法的访问修饰符

这篇文章主要介绍了C#类的访问修饰符用法,较为详细的分析了C#类的访问修饰符概念与用法,具有一定的参考借鉴价值,需要的朋友可以参考下 本文详细分析了C#类的访问修饰符用法,分享给大家供大家参考.具体用法分析如下: 默认情况下,类声明为内部的,即只有当前工程中的代码才能访问它.可以用internal访问修饰符关键字显式指定,但这不是必须的,类在定义时默认为此类型的类.但是C# 方法默认访问级别: private. 方法或者属性的修饰符的访问级别如下图: 访问修饰符 意 义 public 访问不受限

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

要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.设计良好的模块会隐藏所有的实现细节,把它的API与它的实现清晰地隔离开来. 信息隐藏之所以非常重要有许多原因,其中大多数理由都源于这样一个事实:它可以有效的解除组成系统的各个模块之间的耦合关系,使得这些模块可以独立地开发.测试.优化.使用.理解和修改. 第一个规则很简单:尽可能地使每个类或者成员不被外界访问. 对于顶层的(非嵌套)的类和接口,只有两种可能的访问级别:包级私有的

Effective Java 第三版——15. 使类和成员的可访问性最小化

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 类和接口是Java编程语言的核心.它们是抽象的基本单位.该语言提供了许多强大的元素,可以使用它们来设计类和接口.本章包含指导原则,帮助你充分利用这些元素,使你的类和接口是可