我正在阅读这篇关于 .NET 中属性和方法的使用的MSDN文章。它指出了为什么以及何时使用属性或方法。
属性旨在像字段一样使用,这意味着属性不应计算复杂或产生副作用。
否则应该使用方法。
我在问自己如何用 Java 来表达这种差异。
你有什么意见?
我正在阅读这篇关于 .NET 中属性和方法的使用的MSDN文章。它指出了为什么以及何时使用属性或方法。
属性旨在像字段一样使用,这意味着属性不应计算复杂或产生副作用。
否则应该使用方法。
我在问自己如何用 Java 来表达这种差异。
你有什么意见?
我在问自己如何用 Java 来表达这种差异。
只是不要get
在方法上使用前缀,因为它通常意味着该方法很便宜(因为 getter 通常只访问字段、委托给其他 getter 或基于其他 getter 执行相当简单的计算)。例如,如果一个类有这个接口:
class Blob {
long getLength() { ... }
ByteBuffer getBytes() { ... }
Sha1Checksum getChecksum() { ... }
}
...似乎从 中获取长度、内容和校验和的Blob
成本同样高。如果我们这样做了,那么:
interface Blob {
long getLength() { ... }
ByteBuffer getBytes() { ... }
Sha1Checksum calculateChecksum() { ... }
}
......很明显(呃)我们可以预期calculateChecksum()
比其他操作更昂贵,因为它的名字表明它要做的不仅仅是得到一些东西。
在某种程度上,复杂性是一个不应该在接口中看到的实现问题(也许我决定在Blob
构建时急切地计算校验和?),但在某些情况下进行区分是有意义的。
这取决于。如果所有操作都是完全内部的,那么getSomething()
即使对于复杂的实现也是可以的——getter/setter/properties 的全部意义在于封装实现细节并隐藏它们,即使将来它们会变得复杂。
一个例外是,如果操作非常复杂,可能会占用大量时间或资源(例如,从互联网下载一些数据)。在这种情况下,我可能会使用不同的方法名称 - 它有点破坏封装,但它很有用且实用。
但是,如果 getter 有任何可观察到的副作用,我可能不会使用简单的getSomething()
约定,以避免混淆。也许我会使用updateAndReturn()
or getAndComplexify()
or or getFromWeb()
or 类似的东西。
我只是不同意那篇文章所说的。属性是语法糖,否则你只需要使用字段。
getter/properties 的重点是封装——用户不知道它是否只是一个字段、您每次计算的东西还是随机值。
这意味着对我来说,Java 中不是“数据结构”的每个类都有其字段的 getter 和 setter(需要可访问)。
C# 属性基本上是 Java 的 getter 和 setter 合二为一。如果我需要在一个实例中同时使用 geter 和 setter,我总是选择属性。在java中,我没有这个选项。