POJO有什么优势?

在我的项目中,我有一个小数据结构Key

 public class Key implements Serializable { private static final long serialVersionUID = 1L; public String db; public String ref; public Object id; protected Key() { } public Key(String db, String ref, Object id) { this.db = db; this.ref = ref; this.id = id; } } 

是的,这个课程很简单,每个领域都可公开访问。

但有人建议我使用POJO风格的课程,但当我问他们为什么无法告诉我。

在我看来,调用gettersetter比直接访问字段要慢。

那么为什么我必须使用POJO编程风格呢?

取自维基百科:

POJO是Plain Old Java Object的首字母缩写。 该名称用于强调给定对象是普通Java对象,而不是特殊对象。

POJO通常很简单,因此不依赖于其他库,接口或注释。 这增加了在多种项目类型(Web,桌面,控制台等)中重用它的可能性。

正如有人已经在评论中指出的那样,你的对象在技术上已经是一个POJO,但是你已经特别询问了更类似于JavaBeans的getter和setter。

我可以考虑使用getter和setter的原因有很多:

  1. 您可能只想获得一些值(IE只读值)。 对于字段,客户端可以直接获取和设置值。 如果字段被标记为final,则可以将其设置为只读,尽管这并不总是保证它们是不可变的(参见第9点)。
  2. Getter和setter方法允许您更改基础数据类型,而不会破坏类的公共接口,这使得它(和您的应用程序)更加健壮并且能够适应变化。
  3. 您可能希望调用其他一些代码,例如在获取或更改值时发出通知。 您目前的class级无法做到这一点。
  4. 您正在暴露您的类的实现,在某些情况下可能存在安全风险。
  5. Java bean是围绕POJO设计的,这意味着如果您的类没有实现为一个类,那么某些工具和库不能使用它们,以期您的类遵循这些完善的原则。
  6. 您可以公开由字段IE计算的值支持的值,例如getFullName() ,它是由字段支持的getFirstName()getLastName()的串联。
  7. 您可以向setter方法添加validation,以确保传递的值正确。 这可确保您的类始终处于有效状态。
  8. 您可以在getter和setter中设置断点,以便在获取或更改值时调试代码。
  9. 如果字段是对象(IE不是基本类型),那么类的内部状态可以被其他对象修改,这可能导致错误或安全风险。 您可以通过返回对象的副本来保护POJO的getter中的这种情况,以便客户端可以处理数据而不会影响对象的状态。 请注意,拥有最终字段并不总能保护您免受此类攻击,因为客户端仍然可以对正在引用的对象进行更改 (假设该对象本身是可变的),一旦设置了字段,您就无法将字段指向不同的引用。

是的,通过方法调用访问或设置值可能比直接字段访问慢,但差别几乎不明显,它肯定不会成为程序的瓶颈。

虽然优点很明显,但这并不意味着吸气剂和制定者是银弹。 在设计真实世界,强大的可扩展类时,需要考虑许多“问题”。

在设计具有getter和setter的类时,对一个非常相似的问题的回答会详细考虑一些注意事项。 尽管根据您正在设计EG的类的类型,建议可能更相关,但是在大型系统中构成API的一部分而不是简单的数据传输对象。

另请注意,在某些情况下,具有直接字段的类可能是有利的,例如当速度必不可少或内存有限时,尽管只应在分析代码并发现它实际上是瓶颈之后才考虑这一点

另外要小心,你不仅要将所有字段包装在getter和setter中,因为这实际上缺少封装点。

这个答案很好地总结了使用getter和setter选择POJO而不是JavaBean样式对象的原因。

使用私有类变量和公共getter和setter,它们将为您提供Encapsulation。

getter和setter,尤其是最简单的表单将由JIT编译器内联,从而消除方法调用开销。 这听起来非常像过早优化。 如果你遇到瓶颈,那就剖析并查看它发生的位置。 我相当肯定它不会在财产访问中。

获得有效Java这本书。

  • 项目14,在公共类中使用访问器方法而不是公共字段。

在这个Joshua Bloch说,包私有或嵌套类中的公共字段没有任何遗传错误,但强烈建议不要使用公共类。

他详细介绍了这个主题,这是一本很棒的书,建议你复印一下。

想象一下,如果其他程序员正在使用您的代码。 如果你不提供setter和getter方法,那么他可以直接调用你的变量,它肯定会影响你的代码。 它可能导致安全问题因此,通过提供POJO类,您迫使他调用您的方法而不是直接调用您的Instance变量。