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

时间:2015-03-19 06:52:24

标签: java oop reflection setter getter

Java类中常见的有许多getter和setter方法,每个方法对应一个数据模型类变量。我意识到很多IDE会为你创建这些,但是我试图避免这种混乱,并且在我的课程中没有所有这些方法。那么,有没有办法以类外的只读方式访问变量(就像它是公共最终的那样),同时保持对类或子类内部的写访问(就像它是私有的或受保护的一样)。

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

任何人都有更好的主意吗?

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:4)

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

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

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

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

答案 2 :(得分:0)

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

但是,可能不是你想要的。一般来说,我认为暴露变量不是一个好主意。