对象属性(property)和 getters , setters 方法
“需要为一个对象的属性添加 Getters / Setters 方法”而提出为什么?由此而进行深入思考。
它是字段(field)
在 Java 中我们都知道如何在类(Class)中声明一个成员属性(field)。
public class HikariConfig {
public long connectionTimeout;
public long validationTimeout;
}
当我们需要设置对象的属性值时,我们可以直接使用 =
赋值。
public class HikariConfigTests {
public static void main(String[] args) {
var config = new HikariConfig();
config.connectionTimeout = 250;
config.validationTimeout = 250;
}
}
如果我们需要在设置 connectionTimeout
属性时,做一些赋值校验。比如:connectionTimeout 不能小于 250ms 。
public class HikariConfigTests {
public static void main(String[] args) {
var config = new HikariConfig();
var connectionTimeoutMs = 250;
if (connectionTimeoutMs < 250) {
throw new IllegalArgumentException("connectionTimeout cannot be less than 250ms");
}
config.connectionTimeout = connectionTimeoutMs;
}
}
属性(property)具有封装性
面向对象有三大特性:继承、 封装、多态。
我们应该已经发现校验 connectionTimeout 的逻辑(代码)被放置在 HikariConfig 对象自身之外,但从面向对象的角度来说如校验属性的代码应该放在 connectionTimeout 上,但是字段(field)不具备封装性。
如果你发现了这个问题,那么面向对象的设计者们也一样会发现这个问题。
当听到属性这个词时,你想到的是什么呢?
- 你可能想到的是字段(field),因为 field 常常会被翻译为成员属性(field)。
- field 真正要表达的意思是:一块存放数据区域。
一个对象是由属性和操作组成的。操作可以被封装成一个方法:
public interface Runnable {
void run();
}
如果操作可以被封装成方法,那么如何封装属性呢?
现代的编程语言为使用者提供了一些语法糖来封装属性,比如:C# , Kotlin , Typescript , Scala 等等。
在 Kotlin 中我们可以使用 get
和 set
关键字