【问题标题】:In Java, is there a better alternative to getter and setter methods?在 Java 中,有没有更好的替代 getter 和 setter 方法的方法?
【发布时间】:2015-05-22 05:18:51
【问题描述】:

在 Java 类中通常有很多 getter 和 setter 方法,每个数据模型类变量各有一个。我意识到许多 IDE 会为您创建这些,但我试图避免这种混乱,并且在我的类中没有所有这些方法。那么,有什么方法可以在类外部以只读方式访问变量(就像它是 public final 一样),同时在类或子类中保留写访问权限(就像它是私有的或受保护的一样)。

我想出的唯一伪解决方案是一个基类(或具有默认方法的接口),它有一个 get(String variableName) 方法,然后通过反射获取类的字段并返回适当的字段。缺点是要让它工作,变量必须是公共的,所以只有按照惯例它才能满足我的要求(因为在具有我想要访问的变量的扩展/实现类中,我只调用 get 方法在类之外,并且不实现 set 方法)。我不喜欢的主要一点是,如果变量名发生变化,get 方法的调用者不会导致编译器错误,因为变量名只是一个硬编码的字符串。

谁有更好的主意?

【问题讨论】:

  • 是的。我有一个更好的主意 - 请不要这样做反射非常慢。如果没有设置器/获取器,你就破坏了封装以及抽象。如果你使用像 Spring 这样的框架,你将需要 setter。
  • 你应该读一次Effective java by Joshua Bloch
  • 如果你想避免混乱,那么除非你真的需要它们,否则不要编写 getter 和 setter。
  • 难以避免大量吸气剂造成的混乱。你不需要太多的 setter,因为你应该尽可能让你的类不可变。
  • 我推荐 Groovy。出于这个原因,我几乎专门将它用于数据对象。

标签: java oop reflection setter getter


【解决方案1】:

是的 - 尝试设计你的类,这样你就根本没有 getter 和 setter。通常,在所有字段上都有 getter 和 setter 是一个糟糕的设计,因为它破坏了封装。 Java Bean 的情况是一个例外(您有一个模型类/DTO 或某个映射到 XML/JSON 的类);在这里你不应该介意它们,因为 setter 和 getter 是唯一的方法。

在具有逻辑的类中,通过构造函数或直接注入依赖项(如果您使用 Spring/CDI 并且喜欢它)。这更安全,因为您不会有处于不一致状态的对象;例如,您创建了一个对象,但忘记调用 setter -> NullPointerException。但是通过使用构造函数,您可以避免忘记调用 setter 的情况。

当然也可能有例外,比如当你不希望构造函数中的所有依赖项一直在设置一些可选字段时。然而,这可以通过重载构造函数来解决,或者如果情况更复杂,可以使用构建器模式以更优雅的方式解决问题。

查看一篇很棒的文章:http://www.javaworld.com/article/2073723/core-java/why-getter-and-setter-methods-are-evil.html

【讨论】:

    【解决方案2】:

    您可以使用lombok - 手动避免gettersetter 方法。但它自己创造。

    lombok 的使用显着减少了大量代码。我发现它非常好并且易​​于使用。但是在这里你可能会发现使用lombokhere 的一些优点和缺点。

    希望它会有所帮助。
    非常感谢。

    【讨论】:

      【解决方案3】:

      Java FX 引入了类似于你想要的东西:ReadOnlyProperty

      不过,可能不是您正在寻找的。一般来说,我认为公开变量不是一个好主意。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 2011-04-14
      • 2017-09-09
      • 2014-03-14
      • 1970-01-01
      相关资源
      最近更新 更多