Java中复杂getter的命名约定

时间:2010-06-03 08:59:48

标签: java naming-conventions getter-setter

我正在阅读这篇关于.NET中属性和方法用法的MSDN article。它指出了为什么以及何时使用属性或方法。

  

属性意味着像   字段,意味着属性应该   不是计算复杂或   产生副作用。

否则应该使用方法。

我问自己如何在Java中表达这种差异。

您有什么看法?

4 个答案:

答案 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中,我没有这个选项。