【问题标题】:Naming conventions for complex getters in JavaJava 中复杂 getter 的命名约定
【发布时间】:2010-06-03 08:59:47
【问题描述】:

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

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

否则应该使用方法。

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

你的意见是什么?

【问题讨论】:

  • “复杂的吸气剂”对我来说听起来很矛盾

标签: java naming-conventions getter-setter


【解决方案1】:

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

只是不要在方法上使用get 前缀,因为它通常意味着该方法很便宜(因为 getter 通常只访问字段、委托给其他 getter 或基于其他 getter 执行相当简单的计算) .例如,如果一个类有这个接口:

class Blob {
    long getLength() { ... }
    ByteBuffer getBytes() { ... }
    Sha1Checksum getChecksum() { ... }
}

...从Blob 获取长度、内容和校验和似乎同样昂贵。如果我们这样做,则改为:

interface Blob {
    long getLength() { ... }
    ByteBuffer getBytes() { ... }
    Sha1Checksum calculateChecksum() { ... }
}

... 很明显(呃)我们可以预期calculateChecksum() 比其他操作更昂贵,因为它的名字表明它要做的不仅仅是得到一些东西。

在某种程度上,复杂性是一个不应该在接口中看到的实现问题(也许我决定在构造Blob时急切地计算校验和?),但在某些情况下它是有意义的做出区分。

【讨论】:

    【解决方案2】:

    我只是不同意那篇文章所说的。属性是语法糖,否则你只能使用字段。

    getter/properties 的重点是封装 - 用户不知道它是简单的字段、您每次计算的东西还是随机值。

    这意味着对我来说,Java 中不是“数据结构”的每个类都有其字段的 getter 和 setter(需要可访问)。

    【讨论】:

    • 我同意这篇文章。该类的用户应该能够大致理解为什么会有 GetXXX()-Method 而不是简单的属性。我还希望每次调用类的属性时都能获得相同的值(当然,如果它没有被更改)。
    【解决方案3】:

    这取决于。如果所有操作都是完全内部的,那么getSomething() 即使对于复杂的实现也是可以的——getter/setter/properties 的全部意义在于封装实现细节并隐藏它们,即使将来它们会变得复杂。

    如果操作非常复杂,可能会占用大量时间或资源(例如从互联网下载一些数据),则例外情况。在这种情况下,我可能会使用不同的方法名称 - 它有点破坏封装,但它很有用且实用。

    但是,如果 getter 有任何可观察到的副作用,我可能不会使用简单的 getSomething() 约定,以避免混淆。也许我会使用updateAndReturn()getAndComplexify()getFromWeb() 或类似的东西。

    【讨论】:

      【解决方案4】:

      C# 属性基本上是 Java 的 getter 和 setter 合二为一。如果我需要在一个实例中同时使用 geter 和 setter,我总是选择属性。在java中,我没有这个选项。

      【讨论】:

      • ... msdn 示例显示的是 C++,而不是 C# 代码。 C# 也有“属性”吗?
      • msdn 文章是关于 .NET 的。 C# 也有属性,就像 C++/CLI 一样。
      猜你喜欢
      • 2011-02-26
      • 2020-05-15
      • 1970-01-01
      • 2011-03-13
      • 2013-08-05
      • 2018-06-10
      相关资源
      最近更新 更多