在Java中,有没有比getter和setter方法更好的选择?

问题描述 投票:7回答:3

在Java类中,通常有很多getter和setter方法,每个数据模型类变量每个都有一个。我意识到很多IDE都会为您创建这些,但是我试图避免这种混乱,并且我的类中没有所有这些方法。因此,是否有任何方法可以在类外部以只读方式访问变量(就像它是公共final一样),而又只能在类或子类内部保留写访问(就像是私有的或受保护的)。

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

有人有更好的主意吗?

java oop reflection setter getter
3个回答
4
投票

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

lombok的使用显着减少了大量代码。我发现它很好并且易于使用。但是在这里您可能会发现使用lombok here的利弊。

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


4
投票

是的-尝试设计您的班级,这样您就完全没有getter和setter了。通常,在您的所有字段上都使用吸气剂和塞子吸气器是一个糟糕的设计,因为它破坏了封装。 Java Beans是一个例外(在Java Beans中,您有一个模型类/ DTO或某些映射到XML / JSON的类);在这里您不应该介意它们,因为setter和getter是唯一的方法。

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

当然,可能会有例外,例如当您不希望构造函数一直都具有所有依赖项时设置一些可选字段时。但是,这可以通过重载构造函数来解决,或者如果情况更复杂,则可以使用生成器模式以更优雅的方式解决问题。

[参见此文章:http://www.javaworld.com/article/2073723/core-java/why-getter-and-setter-methods-are-evil.html


0
投票

Java FX引入了类似于您想要的内容:ReadOnlyProperty

不过可能与您所寻找的不完全相同。通常,我认为公开变量不是一个好主意。

© www.soinside.com 2019 - 2024. All rights reserved.