java - 如何在java中只设置变量一次

标签 java final setter

我需要在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/

相关文章:

java - 空检查时可能未初始化错误

python 为什么首选setter?

ios - 对于 "look"类属性的方法,@property 和 getters/setters 之间有什么区别?

java - 您可以通过 EventQueue 逐步更新 JPanel 吗?

java - 显示哪个月的降雨量最低 - arrays java

java - 在 Java 中,为什么我不能在父类中声明一个最终成员(不初始化它)并在子类中设置它的值?我该如何解决?

没有参数的 Python setter?

java.lang.NoSuchMethodError 当方法肯定存在时

java - JNI 对象指针

spring - 自定义或提供提示以允许 Spring MongoTemplate 使用 final 成员反序列化对象