Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java以编程方式强制使用final_Java_Final - Fatal编程技术网

Java以编程方式强制使用final

Java以编程方式强制使用final,java,final,Java,Final,什么是确保值只设置一次的正确方法,尽管设置时间未知(即:不在构造函数中)。我可以执行空检查或跟踪标志并抛出异常-但我应该抛出什么异常?这是一个小型的本地化库,我不喜欢为这种看似通用的情况创建我自己的ValueReadyAsigned异常。该方法可能抛出非法状态异常,因为javadocs说: 表示已在非法位置调用方法 时间 在二传中。这样做: private foo bar; public void setFoo(foo bar) { if (this.bar == null) {

什么是确保值只设置一次的正确方法,尽管设置时间未知(即:不在构造函数中)。我可以执行空检查或跟踪标志并抛出异常-但我应该抛出什么异常?这是一个小型的本地化库,我不喜欢为这种看似通用的情况创建我自己的ValueReadyAsigned异常。

该方法可能抛出
非法状态异常,因为javadocs说:

表示已在非法位置调用方法 时间


在二传中。这样做:

private foo bar;

public void setFoo(foo bar) {
    if (this.bar == null) {
        this.bar = bar;
    } else {
        System.out.println("Don't touch me!");
        // J/K Throw an IllegalStateException as Michal Borek said in his answer.
    }
}

我认为您自己的异常定义不是什么大问题,特别是当它扩展了
RuntimeException
时。因此,我建议您定义
valueReadySetException扩展非法状态异常
,并使用它

下一点是根据@Renan的建议复制每个setter的逻辑。我向你建议如下。定义并使用特殊的通用容器:

public class SetOnceContainer<T> {
    private Class<T> type;
    private String name;
    private T value;
    private boolean set = false;

    public SetOnceContainer(Class<T> type, String name) {
        this.type = type;
        this.name = name;
    }

    public void set(T value) {
        if (set) {
             throw new ValueAlreadySetException(name);
        }
        this.value = value;
        this.set = true;
    }
    public T get() {
        return value;
    }
}

实现被封装到一次点中。如果需要,您可以一次性更换。也支持空值。二传手和接球手只是比常规球员稍微复杂一点

我不建议抛出标准异常,因为可能会出现这样的情况,即您实际上正在处理这些异常,然后您将不知道自己是否非法抛出了这些异常。为这个创建一个异常类并没有什么错。好吧,我不确定是谁首先回答:P,但IllegalStateException似乎没问题。我觉得这不是完全合适的,因为这不是一个“不合适的时间”,而是一个完整性错误(客户端应该只调用一次)setter不是线程安全的,可以添加一些同步代码:)我想出于我的目的,我会使用IllegalStateException,但我没有想到通用包装器+1.
public MyClass {
    private SetOnceContainer<Integer> number = new SetOnceContainer<Integer>(Integer.class, "number");
    private SetOnceContainer<String> text = new SetOnceContainer<String>(String.class, "text");


    public void setNumber(int value) {
        number.set(value);
    }
    public void setText(String value) {
        text.set(value);
    }
    public Integer getNumber() {
        return number.get();
    }
    public String getText() {
        text.get();
    }
}