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