在项目中,我有一个小的数据结构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样式类代替,但是当我问他们为什么无法告诉我。
在我看来,调用getter和setter方法比直接访问场慢。
那么,为什么我必须使用POJO的编程风格?
从维基百科:
POJO是普通Java对象的缩写。 这个名字是用来强调一个给定的对象是一个普通的Java对象,而不是一个特殊的对象。
一个POJO通常是简单,所以将不依赖于其他库,接口或注释。 这增加,这可以在多种项目类型(Web,桌面,控制台等)被重用的机会。
正如有人已经在评论中指出的那样,你的目标在技术上是一个POJO已经然而你有特别要求有关getter和setter这更类似于JavaBeans的。
有一些我能想到的使用getter和setter方法的原因:
- 你可能只是想获得一些数值(如只读值)。 随着领域,客户可以get和直接设定值。 字段可以进行读取,只有当他们被标记为最终虽然这并不总是保证他们是不可变的(见9点)。
- 的getter和setter方法允许你改变底层数据类型,而不破坏你的类的公有接口,这使得它(和你的应用程序)更强大而有弹性的变化。
- 您可能需要调用一些其他的代码,例如当获得或更改值提高的通知。 这是不可能与当前类。
- 你是暴露你的类的实现可能是在某些情况下存在安全隐患。
- 的Java bean都是围绕POJO的,这意味着,如果你的类没有一个实现了它不能被那些期望你的类遵守这些公认的原则某些工具和库使用。
- 可以公开未通过场IE计算的值备份诸如值
getFullName()
这是一个级联getFirstName()
和getLastName()
其是由字段支持。 - 您可以添加验证您的setter方法,以确保所传递的价值观是正确的。 这可以确保您的类始终处于有效状态。
- 您可以在您的getter和setter一个断点,这样,当获得或修改的数值,就可以调试代码。
- 如果该字段是一个对象(IE不是原始类型),那么你的类的内部状态可以通过其他物体可导致错误或安全风险来修改。 您可以通过返回对象的副本 ,以便客户端可以与数据的工作,而不会影响你的对象的状态,防止出现这种情况在POJO的getter。 需要注意的是具有最终场并不总是保护你免于此类攻击的客户端仍然可以修改被引用的对象 (提供对象本身是可变的),你就不能在不同的参考点的场一旦被设定。
是的,访问或设置通过方法调用的数值可能比直接字段访问速度较慢,但不同的是几乎察觉不到它当然不会在你的程序中的瓶颈。
虽然优点是显而易见的,这并不意味着getter和setter方法是万能的。 还有一些“陷阱”设计真实的世界,强大的可扩展的类时要考虑的。
这种设计具有getter和setter类时回答一个非常类似的问题着眼于细节的一些注意事项。 虽然这取决于你正在设计EG形成的API的一部分,在一个大的系统,而不是一个简单的数据传输对象的类类的类型的建议可能会更有意义。
另请注意,有可能是某些场景中直接场一类可能是有利的,例如当速度是关键或内存限制,不过这应该只是剖析你的代码,并发现它实际上是一个瓶颈后考虑 。
另外要小心,你不只是包装都在getter和setter方法,因为这你的领域是真正缺少封装的地步。
这个答案提供的原因好好总结超过与getter和setter方法,JavaBean风格的对象选择一个POJO。
使用私有类变量和公共getter和setter方法将为您提供封装。
getter和setter方法,尤其是最简单的形式将只由JIT编译器内联,从而去除方法调用的开销。 这听起来非常像过早优化。 如果你遇到一个瓶颈,然后点击个人资料,看看那里发生。 我相当肯定的属性访问它会不会。
让自己的书有效的Java。
在这约书亚布洛赫说,有什么inheriently错公共领域中包私人或嵌套类,但强烈建议不要使用公共类。
他进入更详细的关于这个问题,这是一个伟大的书,建议你得到一份拷贝。
如果一些其他的程序员使用你的代码想象。 如果你不提供setter和getter方法,然后他就可以直接打电话给你的变量,它肯定会影响到您的代码。 它可能会导致安全问题,因此,通过提供POJO类,你强迫他对你的方法调用,而不是直接调用您的实例变量。