检查是否已设置原语

时间:2019-11-16 09:09:14

标签: java primitive

给出一个非常简单的类:

C_File_B

要检查是否尚未分配class MyClass { int id; double value; MyClass(int id) { this.id = id; } void setValue(double v) { value = v; } boolean isValueUnassigned() { return value == 0; } } ,因为value默认为return value == 0;,如果我只是double,可以吗?

8 个答案:

答案 0 :(得分:5)

您应该去double的包装类,即Double。对于Double数据类型,默认值为null。这样就不会有任何歧义。如果value为null,则不会分配任何值。

答案 1 :(得分:4)

好吧,是的,原语double默认情况下设置为0.0。但是,如果您只是做return value == 0;,则不能确定是否有人曾经打电话给setValue(0),但这也是有效的分配。如果您想100%确定有人打电话给setValue(),我建议您这样做:

class MyClass {
    private int id;
    private double value;
    private boolean valueSet; // is false by default 

    public MyClass(int id) {
        this.id = id;
    }

    public void setValue(double v) {
        value = v;
        valueSet = true;
    }

    public boolean isValueSet() {
        return valueSet;
    }
}

答案 2 :(得分:1)

  

您可以使用Double,使用以下

重新初始化double
class MyClass {
    int id;
    Double value;

MyClass(int id) {
    this.id = id;
}

void setValue(Double v) {
    value = v;
}

boolean isValueUnassigned() {

   return value == null ? false : true;
}
}

答案 3 :(得分:0)

添加@Harshal已经说过的话。诸如此类的代码如下所示:

class MyClass {
    private int id;
    private Double value;

    public MyClass(int id) {
        this.id = id;
    }

    public void setValue(double v) {
        value = v;
    }

    public double getValue() {
        //Check for null pointer and return 
        if(value == null)
            return <whatever you want>;

        return value.doubleValue();;
    }

    public boolean isValueSet() {
        return (value == null ? false : true);
    }
}

答案 4 :(得分:0)

说明

这里的主要问题是,无论您选择哪种double值,例如0-1,它实际上可能是用户设置的有效值。在这种情况下,您的应用程序会错误地返回尚未设置的信息。

您需要的称为前哨值,即表示这种情况的特殊值。通常有3种方法:


标志

引入一个简单的布尔标志boolean isSet,您可以将其初始化为false,并在设置后将其设置为true

这种方法很好,而且非常快。但是,例如,如果您开始引入数百个需要代表“尚未设置”的此类值,则扩展性就不好。

double value;
boolean isValueSet = false;

void setValue(double value) {
    this.value = value;
    isValueSet = true;
}

boolean isValueUnassigned() {
    return !isValueSet;
}

对象包装器

对象变量除了其实际值/实例外,还可以参考null。可以用作指示特殊情况的标记。

因此,您可以使用以Double开头的内部表示为double而不是null的值。

缺点是,与简单原语相比,对象会引入很多内存和性能开销。在这种情况下,这并不重要,但是如果将其扩展到成千上万,肯定会开始感受到影响。

Double value = null;

void setValue(double value) {
    this.value = value; // auto-boxing
}

boolean isValueUnassigned() {
    return value == null;
}

前哨值

如果您的应用程序自然允许永远不能使用某些值,则可以将它们用作标记以指示情况。一个常见的示例是一个age字段,您不允许用户将其设置为负值。然后,您可以使用-1来表示它。

这种方法非常普遍且有效。但这显然并不总是适用,也不一定是最易读/可维护的方法。

double value = -1;

void setValue(double value) {
    if (value < 0) {
        throw new IllegalArgumentException("Negative values are not allowed");
    }
    this.value = value;
}

boolean isValueUnassigned() {
    return value == -1;
}

答案 5 :(得分:0)

在创建对象时分配值。您不需要一种方法来检查是否已分配了该值,因为答案始终是肯定的。

答案 6 :(得分:-1)

找到了最干净,最清晰的表达方式:

class MyClass {
    int id;
    Optional<Double> value;

    MyClass(int id) {
        this.id = id;
        this.value = Optional.empty();
    }

    void setValue(double v) {
        value = Optional.of(v);
    }

    double getValue() {
        if (isValueUnassigned) {
            throw new RuntimeException("Value has not been assigned");
        }
        return value.get();
    }

    boolean isValueUnassigned() {
        return value.isEmpty();
    }
}

答案 7 :(得分:-3)

默认情况下,双精度值是0,但您可以将-1传递给它。

sddw@we.com:@defe@wefe@fee

进行检查:

sddw@we.com:defewefefee
相关问题