数据类型原始对象未正确初始化布尔值

时间:2015-04-20 17:57:15

标签: java primitive-types custom-data-type

我必须创建一个包装类来保存任何原始数据类型。我创建了这个类,除了布尔值之外,它的所有内容都可以正常工作。这是我的代码:

byte a; // the byte in primitive
short b; // the short
int c, j; // int c is is int, j is the counter for Primitive to tell what dataType it is
long d; // the long
float e; //the float
double f; // the double
boolean g; // the boolean, with which I am having problems
char h; // the char
...;
public Primitive(boolean i) {
    g = i; 
    j = 6;
}

top方法按预期工作,但是,当我尝试使用copy方法时,无论i是真还是假,它都会使布尔值等于true。

public Primitive(Primitive i){
    switch (i.j){
    case 0: a = i.a; break;
    case 1: b = i.b; break;
    case 2: c = i.c; break;
    case 3: d = i.d; break;
    case 4: e = i.e; break;
    case 5: f = i.f; break;
    case 6: g = i.g; break;
    case 7: h = i.h; break;
    }
}

非常感谢任何帮助。

编辑**

在测试了所有情况的复制构造函数后,我发现复制构造函数不适用于short,boolean和char数据类型。它适用于其他一切。这是我修改过的代码:

public class Primitive {
    private byte bytes;
    private short shorts;
    private int integer;
    private final int DATATYPE;
    private long longs;
    private float floaters;
    private double doubles;
    private boolean bools;
    private char character;
    Compare compare = new Compare();
    /**************************************************|
    |*                  Constructors                  *|
    |**************************************************/
    public Primitive(byte i) {
        bytes = i;
        DATATYPE = 0;
    }
    public Primitive(short i) {
        shorts = i;
        DATATYPE = 1;
    }
    public Primitive(int i) {
        integer = i;
        DATATYPE = 2;
    }
    public Primitive(long i) {
        longs = i;
        DATATYPE = 3;
    }
    public Primitive(float i) {
        floaters = i;
        DATATYPE = 4;
    }
    public Primitive(double i) {
        doubles = i;
        DATATYPE = 5;
    }
    public Primitive(boolean i) {
        bools = i; 
        DATATYPE = 6;
    }
    public Primitive(char i) {
        character = i;
        DATATYPE = 7;
    }
    public Primitive(Primitive i){
        switch (i.DATATYPE){
        case 0: bytes = i.bytes; break;
        case 1: shorts = i.shorts; break;
        case 2: integer = i.integer; break;
        case 3: longs = i.longs; break;
        case 4: floaters = i.floaters; break;
        case 5: doubles = i.doubles; break;
        case 6: bools = i.bools; break;
        case 7: character = i.character; break;
        }
        DATATYPE = i.DATATYPE;
    }
    ...;
}

我打算尝试使用ENUM,但我忘记了如何使用它。那,我认为整数比ENUM更容易操作。

2 个答案:

答案 0 :(得分:2)

您忘记设置新基元的j值。切换后添加以下内容:

this.j = i.j

如果没有这个,第二次尝试制作构造函数时,它会回到案例0.我怀疑它只是因为你还没有测试过这个案例而对其他值起作用,但很难说没有看到那段代码。

答案 1 :(得分:2)

如上所述,关键错误是无法初始化j。认识到每次在每个构造函数中都必须设置j,您可以标记j" final"。

此外,您拥有的变量旨在混淆。对于j,这是尤其的情况。首先,将控制变量j作为1个字母的变量名称与您的域数据c一起使用是非常令人困惑的。不需要这么紧凑(编译器这样做)。一个字母变量名称令人困惑。

使用int来了解类型真的是老派。 Enum会更合适。

(并且正如另一个响应者所指出的;这必须是家庭作业,因为内置的原始包装类(Integer for int,Boolean for boolean,...)是为此设计的并且被烘焙成语言。)

如果您决定保持代码大致不变,请至少重命名j并将其与c分开。