某些java类需要具有带有公共getter和setter的私有属性才能正常运行。例如,JSF bean和JPA实体需要它们。如果它不是那些库,可能有一些属性不应该有任何getter,绝对不是setter。通常也不鼓励空构造函数供自定义代码使用。例如
@Entity
public class MyEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
public MyEntity() {}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
}
在这个类中,方法setId永远不应该由手动代码调用。但是该方法并未弃用,因此@Deprecated注释将是错误的。
除了@Deprecated还有其他方法告诉不应该使用某个方法吗?
答案 0 :(得分:3)
JPA实体不需要公共getter和setter。使用反射设置值(至少在使用您可能正在使用的EclipseLink或Hibernate时)。
在这个特殊的例子中,你可以简单地将设定者排除在外,我已经养成了习惯并且从未遇到过问题。 注意:当涉及到属性和getter / setter时,坚持使用Java命名约定。某些库/框架(错误的imo)依赖于此。
至于问题的全球概念,我很惊讶我没有看到包含文档的建议。文档已经,现在并且可能始终是您与代码用户的最佳沟通。
/**
* WARNING! DO NOT USE THIS UNLESS YOU ARE GOD!
* This will probably break stuff unless...
* ....
*/
public void doEvilHackishThings()
{
// Stuff happens here.
}
如果您正确记录代码,开发人员就会知道他们何时可能会破坏代码。确保您不应用巫毒代码等。良好的文档详细描述了它的作用以及它是如何做到的。没有理解为什么它是邪恶的,没有正确思想的开发人员会触及示例方法。
答案 1 :(得分:0)
您可以使用由该具体类支持的接口来隐藏getter和setter。这也会鼓励Tell,不要问,因为你可以在界面上使用任何getter。构造函数的用法也可以隐藏在工厂中。