字段(fields)与属性(properties)的定义
- 字段与属性都是OOP(面向对象编程)中的概念。
- 字段是指封装在类或对象中的数据,因此也被叫做数据成员(data member)或成员变量(member variable)。
- 属性是指从属于类或对象的一种介于字段和方法之间的特殊成员:属性可以像字段一样读和写,但是读和写通常被翻译成类或对象的 getter(读取器) 和 setter(设置器) 方法。读取器和设置器统称为存取器(accessor)。
- 在 getter 方法里,属性可以用来实现只读(readonly),计算(computed),门面(facade),惰性(lazy)以及单例(singleton)等诸多特性。
- 在 setter 方法里,属性可以用来实现数据检验(data validation)和用户界面的实时更新(active update)。
字段和属性的可用性
- 在一些老的程序语言(C++, Java)中,只有字段没有属性,属性通过 getter 和 setter 来模拟实现。
- 由于在Java语言中用于实现属性的 getter 和 setter 的方法名具有一定的命名规则,并且属性在框架中广泛使用,所以一般来说可以认为Java语言中事实上存在属性。
- 在C#语言中,字段和属性同时存在。带 getter 或/和 setter 的为属性,不带的为字段。
- 在一些新的程序语言(Swift,Kotlin)中,只有属性没有字段。属性缺省带有 getter 和 setter。
只读字段/属性
只读字段:只能设置一次值之后便只能读取不能再修改的字段。
// C#
readonly int year;
// Java
final int year = ...;
// C++
const int year = ...;
只读属性:只有 getter 没有 setter 的属性。
// C#
对外只读对内可写的属性
处于封装性的需要,有些属性需要对访问权限进行限制,在对象内部可读可写,而在对象外部则只读。