Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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_Variables_Final - Fatal编程技术网

Java 是否可以只定义一次变量而不使用final

Java 是否可以只定义一次变量而不使用final,java,variables,final,Java,Variables,Final,我想知道在Java中是否有一种方法可以只分配一次变量。我知道有最后一个关键字,但我希望在不必在构造函数中设置值的情况下获得相同的结果。 我想在构造函数之外设置它,因为我还不知道该值。您可能需要在分配值之前检查键,例如: Object key; public void setValue(Object value) { if (key != null) { // ignore or throw exception, depending on your business l

我想知道在Java中是否有一种方法可以只分配一次变量。我知道有最后一个关键字,但我希望在不必在构造函数中设置值的情况下获得相同的结果。
我想在构造函数之外设置它,因为我还不知道该值。

您可能需要在分配值之前检查键,例如:

Object key;


public void setValue(Object value) {
    if (key != null) {
        // ignore or throw exception, depending on your business logic
    } else {
        key = value;
    } 
}

除了使用finalkeyword,没有真正的方法

您必须实现一个自定义设置器,该设置器检查值是否已设置:

public boolean setValue(Object value){
    if( this.value == null){
        this.value = value;
        return true;
    }
    return false;
}
或者使用一个不可变对象,这类对象包装了上述行为。有不同的库,提供不可变的对象,或者您自己编写一个:

// Constructor based only allows to set the value when constructing the object
public class Immutable{
    private Object value;

    public Immutable(Object value){
        this.value = value;
    }

    public Object getValue(){
        return this.value;
    }
}

// Setter based provides a setValue method which checks, if the value is already set or not
public class Immutable{
    private Object value;

    public boolean setValue(Object value){
        if( this.value == null){
            this.value = value;
            return true;
        }
        return false;
    }

    public Object getValue(){
        return this.value;
    }
}

在选择自定义不可变对象时,还可以使用泛型使其在值类型的范围内更灵活。

只需分配一次,即可分配一次。如果您违反了自己的意图,final只会给您一个编译时错误。因此,如果没有任何其他信息说明你为什么认为有必要,我只能接受你没有保护。在安装复杂的执行机制之前,我肯定会采取这种方法。自然,该字段将被标记为私有。