gpt4 book ai didi

java - 在 Java 中,是否有更好的方法来替代 getter 和 setter 方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:20:11 25 4
gpt4 key购买 nike

在 Java 类中有很多 getter 和 setter 方法是很常见的,每个数据模型类变量一个。我知道许多 IDE 会为您创建这些,但我试图避免这种困惑,并且我的类中没有所有这些方法。那么,有没有什么方法可以在类外以只读方式访问变量(就好像它是 public final 一样),同时在类或子类内部只保留写访问权(就好像它是私有(private)的或 protected )。

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

谁有更好的主意?

最佳答案

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

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

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

请参阅关于此的精彩文章:http://www.javaworld.com/article/2073723/core-java/why-getter-and-setter-methods-are-evil.html

关于java - 在 Java 中,是否有更好的方法来替代 getter 和 setter 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29138730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com