ove*_*t75 7 java oop reflection getter setter
Java类中常见的有许多getter和setter方法,每个方法对应一个数据模型类变量.我意识到很多IDE会为你创建这些,但是我试图避免这种混乱,并且在我的课程中没有所有这些方法.那么,有没有办法以类外的只读方式访问变量(就好像它是公共最终的),同时保留了类或子类内的写访问权限(就好像它是私有的或受保护的).
我提出的唯一伪解决方案是基类(或具有默认方法的接口),它具有get(String variableName)方法,然后通过反射获取类的字段并返回适当的字段.缺点是,为了工作,变量必须是公共的,所以只有按照惯例它才符合我的要求(在扩展/实现类中有我想要访问的变量,我只调用get方法在类之外,并没有实现set方法).我不喜欢的主要问题是,如果变量名称发生变化,get方法的调用者将不会导致编译器错误,因为变量名称只是一个硬编码的String.
谁有更好的主意?
是的 - 尝试设计你的类,这样你就根本没有 getter 和 setter。通常,在所有字段上都有 getter 和 setter 是一个糟糕的设计,因为它破坏了封装。Java Bean 是一个例外(其中您有一个模型类/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