我需要在java中实现一个类,其中它的字段只需要设置一次,但它的值在字段声明时未知。为此,我有:
public class MyClass {
private String field1 = null;
public void setField1(String value) {
if (field1 == null) {
field1 = value;
}
}
}
但是,我所拥有的并不能阻止用户多次调用 setField1
。当用户尝试设置它时(不知道它已在其他地方设置),这可能会导致困惑,然后用户会因为 field1
没有给出他们设置的值而感到困惑 - 直到他们进入 setField1
方法看看发生了什么。
我不喜欢的另一个解决方案是创建一个构造函数来获取 field1
的值,然后不提供 setter。因为这使得类的扩展变得更加困难,当需要多个 String 字段时 - 在这种方法中,构造函数将需要接受几个 String
作为参数,然后用户可以这样很容易被参数混淆/遗漏。
显然将 field1
设置为 final
也不起作用。
我应该怎样做才能避免上述问题?
最佳答案
这种情况下的常见做法是抛出RuntimeException
。在你的情况下IllegalStateException
最适合:
public void setField1(String value) {
if (field1 != null) {
throw new IllegalStateException("setField1 was already called");
}
field1 = Objects.requireNonNull(value);
}
另请注意,最好检查传递的字符串是否为 null(为此我添加了 Objects.requireNonNull
)。
您无法在编译时控制这一点,因为在不实际运行程序的情况下,不可能分析程序来准确判断该方法是否调用了一次或多次。
关于java - 如何在java中只设置变量一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33772376/