给出一个非常简单的类:
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
,可以吗?
答案 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