【问题标题】:Java field access versus getter syntaxJava 字段访问与 getter 语法
【发布时间】:2012-05-16 10:41:30
【问题描述】:

如果有以下类...

/**
 * Two dimensional cartesian point.
 */
public class Point {
  public final double x;
  private final double y;

  public double y(){
  return this.y;
  }

}

我可以按以下方式检索值 Point.x 或 Point.y() 我认为在 OO 语言中通过不直接访问而是使用访问器来封装数据是一种很好的做法,但似乎直接使用字段访问更正常和可读。

为什么 Java 不允许我为不带参数的函数调用分配哪个 ()。

【问题讨论】:

    标签: java class field getter accessor


    【解决方案1】:

    由于 1995 年左右做出的语言设计选择,Java 不允许您这样做。Java 的目标是成为“蓝领语言”,这意味着构造的总数应该很少,并且每个构造都应该是尽可能明显。

    顺便说一句,与其问自己“为什么 Java 不让我放弃括号”,不如问自己“为什么 Java 让我编写所有那些多余的 getter 和 setter?”大多数其他语言都会自动执行此操作。

    getter/setter 的重点不是封装(如果您只是透明地获取/设置值,则实际上没有封装),而是动态调度。与任何其他方法一样,访问器可以被覆盖;还有一些框架坚持使用它们而不是直接字段访问。

    对我来说,选择拥有public final double 字段就可以了。查看 GridBagConstraints 以获取 JSE 类中公共字段的示例。

    【讨论】:

      【解决方案2】:

      当您考虑它时,代码将变得完全不可读。当你遇到foo.bar这样的东西时,你不会知道它是在访问一个字段,还是在调用一个方法。

      只有在你引入除字段和方法之外的第三种构造:属性时,它才能工作。如果 Java 支持属性,则在没有 () 的情况下访问它们不会损害可读性。 Java 中没有类似属性的构造没有技术原因,这只是一个设计决定。

      但是在没有参数的任何方法调用中允许省略括号是个坏主意。

      【讨论】:

      • 你研究过 Scala 吗?它允许删除空括号。不过,这是否使它不可读是一个悬而未决的问题:)
      • @MarkoTopolnik 是的,这确实是我的观点。这在技术上是可行的(并且确实在 Scala 中完成),但它看起来并不漂亮。
      • 是的,我没有考虑过删除括号可能引起的混乱。但我认为 Java 在执行 OO 原则方面很重要。但是,当您查看内置类时,您永远不会调用函数来检索值。这就是为什么我想知道我的代码中有不同的使用模式。
      猜你喜欢
      • 1970-01-01
      • 2016-07-19
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多