7

一些 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 之外,还有其他方法可以告诉不应使用方法吗?

4

2 回答 2

3

JPA 实体不需要公共 getter 和 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.
}

如果你正确地记录你的代码,开发人员知道他们什么时候可能会破坏东西。确保你没有应用巫毒代码等。好的文档详细描述了它的作用以及它是如何做的。没有一个头脑正常的开发人员会在不理解为什么它是邪恶的情况下接触示例方法。

于 2013-03-07T21:09:28.617 回答
0

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

于 2013-03-07T19:13:02.670 回答