可选的班级成员

Phi*_*ndt 2 java oop

我从XML文件导入数据以在内部使用它.现在有一个uint值,这是(根据XSD)不需要的.现在问题是:如何在我的类中映射此行为(不清楚,如果Value存在与否,但我需要在运行时知道)

基本上我看到3个解决方案:

解决方案1:使用我们知道它们无效的值将值标记为"未设置":

public class Solution1 {
    private int optionalVal;

    public boolean isSetOptionalVal() {
        return (optionalVal>=0);
    }

    public void setOptionalVal(int val) {
        optionalVal = val;
    }

    public void unSetOptionalVal() {
        optionalVal = -1;
    }

    public int optionalVal() {
        if(isSetOptionalVal()) {
            return optionalVal;
        } else {
            return -1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方案2:使用盒装类并null在值为"未设置"时将其设置为:

public class Solution2 {
    private Integer optionalVal;

    public boolean isSetOptionalVal() {
        return (optionalVal!=null);
    }

    public void setOptionalVal(int val) {
        optionalVal = val;
    }

    public void unSetOptionalVal() {
        optionalVal = null;
    }

    public int optionalVal() {
        if(isSetOptionalVal()) {
            return optionalVal;
        } else {
            return -1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方案3:使用另一个将值描述为"未设置"的变量:

public class Solution3 {
    private int optionalVal;
    private boolean optionalValSet;

    public boolean isSetOptionalVal() {
        return (optionalValSet);
    }

    public void setOptionalVal(int val) {
        optionalVal = val;
        optionalValSet = true;
    }

    public void unSetOptionalVal() {
        optionalValSet = false;
    }

    public int optionalVal() {
        if(isSetOptionalVal()) {
            return optionalVal;
        } else {
            return -1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这些是我提出的解决问题的建议,但我并不喜欢这些.

解决方案1似乎非常hacky,也许在某个地方我无法确定无效值.

解决方案2实际上是我正在使用的解决方案,但我只需要一些memeber变量的附加信息,所以我要么使用一些变量作为盒装类型而一些作为原始(看起来不一致)或者我总是使用盒装类型(我不太喜欢).

解决方案3似乎是最干净的,但在这里我担心,在某些地方bool设置不正确,这将是一个很难找到的错误(我已经有很多代码,并发现问题,一些最近才在XML中设置元素)

那么......你更喜欢什么作为解决"可选价值"问题的解决方案 - 是否有更好的解决方案?这个问题一般如何处理?

S.L*_*ica 5

我选择选项2,使用Integer类,并将int和Integer之间的转换保留为自动装箱.这种方法的优点是它可以将与可选值相关的所有内容保存在单个变量中.

第一个选项是魔术值,如果未使用的值稍后变为使用值,则维护成为一个噩梦.

第三个选项意味着必须跟踪int和boolean,它们跟踪是否使用它的问题.如果你打算这样做,可以考虑让它成为一个类本身......但是你也可以使用Integer.