Примитивный объект типа данных неправильно инициализирует логическое значение

Мне нужно создать класс-оболочку для хранения любого примитивного типа данных. Я создал класс, и он работает для всего, кроме логического значения. Это мой код:

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 работает так, как предполагалось, однако, когда я пробую свой метод копирования, он делает логическое значение равным true, независимо от того, является ли i истинным или ложным.

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.


person oakTree    schedule 20.04.2015    source источник
comment
Вы пробовали отлаживать?   -  person Dagriel    schedule 20.04.2015
comment
Можем ли мы увидеть весь источник? Я определенно думаю, что здесь чего-то не хватает, что вызывает проблему.   -  person John    schedule 20.04.2015
comment
Добавлю всю программу.   -  person oakTree    schedule 20.04.2015
comment
Почему бы не использовать встроенные обертки? Они были бы намного эффективнее и были протестированы. Это домашнее задание?   -  person Peter Lawrey    schedule 20.04.2015
comment
@ Питер Лоури Да. Нам нужно создать массив, который может быть любого примитивного типа данных, и использовать его для игры.   -  person oakTree    schedule 21.04.2015
comment
@oakTree в этом случае было бы гораздо эффективнее иметь оболочку для массива примитивов и получать к ней доступ через класс Array. Вы используете 52 байта на элемент, когда оболочка для байта [] будет использовать ближе к 1.   -  person Peter Lawrey    schedule 21.04.2015


Ответы (2)


Как упоминалось выше, ключевая ошибка заключается в том, что не удается инициализировать j. Признавая, что j нужно устанавливать каждый раз в каждом конструкторе, вы можете пометить j как "окончательно".

Кроме того, переменные, которые у вас есть, предназначены для того, чтобы сбивать с толку. Это особенно относится к j. Во-первых, скрывать управляющую переменную j в виде однобуквенного имени переменной с данными вашего домена c очень сложно. Не надо их так туго впихивать (это делает компилятор). НАЗВАНИЯ ПЕРЕМЕННЫХ ИЗ ОДНОЙ БУКВЫ СБИРАЮТ.

Использование int для определения типа — это действительно старая школа. Enum был бы более подходящим.

(и, как заметил другой респондент, это должно быть домашнее задание, поскольку встроенные примитивные классы-оболочки (Integer для int, Boolean для boolean,...) предназначены для этого и встроены в язык.)

Если вы решите оставить код как есть, по крайней мере, переименуйте j и отделите его от c.

person BrianT.    schedule 20.04.2015

Вы забыли установить значение j нового примитива. Добавьте следующее после вашего переключателя:

this.j = i.j

Без этого во второй раз, когда вы пытаетесь сделать копию конструктора, он возвращается к случаю 0. Я подозреваю, что он работает для других значений только потому, что вы еще не тестировали этот случай, но трудно сказать, не видя этот код .

person mk.    schedule 20.04.2015