POJO有什么优势?

jac*_*ope 10 java 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Ben*_*ale 20

取自维基百科:

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

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

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

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

  1. 您可能只想获得一些值(IE只读值).对于字段,客户端可以直接获取和设置值.如果字段被标记为final,则可以将其设置为只读,尽管这并不总是保证它们是不可变的(参见第9点).
  2. 的getter和setter方法允许你改变底层数据类型,而不破坏你的类的公有接口,这使得它(和你的应用程序)更强大而有弹性的变化.
  3. 您可能希望调用其他一些代码,例如在获取或更改值时发出通知.您目前的班级无法做到这一点.
  4. 您正在暴露您的类的实现,在某些情况下可能存在安全风险.
  5. Java bean是围绕POJO设计的,这意味着如果您的类没有实现,那么某些工具和库不能使用它们,这些工具和库希望您的类遵循这些完善的原则.
  6. 可以公开那些值通过场IE计算值如支持getFullName()这是的串联getFirstName()getLastName()其通过字段支持.
  7. 您可以向setter方法添加验证,以确保传递的值是正确的.这可确保您的类始终处于有效状态.
  8. 您可以在getter和setter中设置断点,以便在获取或更改值时调试代码.
  9. 如果该字段是一个对象(IE不是原始类型),那么你的类的内部状态可以通过其他物体可导致错误或安全风险来修改.您可以通过返回防止这种情况下你的POJO的getter 复制的对象,以便客户端可以与数据的工作,而不会影响你的对象的状态.需要注意的是具有最终场并不能永远保护你免于此类攻击的客户端仍然可以修改被引用的对象(提供对象本身是可变的),你就不能在一个点上的场不同的参考一旦被设定.

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

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

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

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

另外要注意的是,您不仅要将所有字段包装在getter和setter中,因为这实际上缺少封装点.

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


Sur*_*nga 5

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