2013-03-07 100 views
5

某些java类需要具有私有属性和公共getter和setter才能正常工作。例如JSF bean和JPA实体需要它们。如果不是那些图书馆,那么可能有些属性不应该有任何获取者,也不应该有任何设置者。空的构造函数通常不鼓励用于自定义代码。例如,不鼓励使用的方法

@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

这个问题与JSF和JPA无关。不过,值得一提的是这些框架。 – 2013-03-07 18:55:27

+0

你的例子不是很好。为什么你会在这种情况下阻止使用setter?它是一个可以存储各种数据组合的实体对象,当然你希望能够设置它的值。 – Perception 2013-03-07 18:55:52

+0

在初始化设置后,您不想更改其唯一标识符。 – 2013-03-07 19:01:44

回答

3

JPA实体不需要公共getters和setter。值是使用反射设置的(至少在使用EclipseLink或Hibernate时可能使用)。

在这个特殊的例子中,您可以简单地将setter关闭,我已经养成了一种习惯,从来没有遇到任何问题。 注意:对于属性和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. 
} 

如果你正确记录你的代码,开发人员知道他们什么时候可能会破坏东西。确保你不应用voodoo代码等等。良好的文档详细描述了它的功能以及它是如何实现的。正确思想的开发者不会理解为什么它是邪恶的。

0

您可以通过使用该具体类所支持的接口来隐藏getter和setter。这也会鼓励告诉,不要问,因为在界面上没有任何getter可以使用。构造函数的用法也可以隐藏在工厂中。

+1

几乎所有实体的接口? – 2013-03-07 19:49:22

+0

那不是那么不寻常。 EMF也是如此。 – SpaceTrucker 2013-03-08 08:00:42

相关问题