Поведение Java Enum - PullRequest
       5

Поведение Java Enum

0 голосов
/ 04 декабря 2009

У нас есть следующее перечисление:

public enum ComponentTypes {

    PDIFF(301),
    TDIFF(302),
    TADJ(303);

    private long componentTypeId;

    private ComponentTypes(long componentTypeId){
        this.componentTypeId = componentTypeId;
    }

    public Long getId(){
        return this.componentTypeId;
    }
}

В одной из наших тестовых настроек мы делаем c.setComponentTypeId(ComponentTypes.TADJ.getId()), но когда в тесте вызывается c.getComponentTypeId(), он выдает NullPointerException, но c.setComponentTypeId(303L) работает как положено. Чего мне не хватает при использовании enum для установки значения?

EDIT

Похоже, @Tom был прямым с длинным / длинным несоответствием. Теперь, когда getId() возвращает long, а не Long, он работает как ожидалось.

EDIT

Похоже, то, что я сказал ранее, было неверным автобокс работает там как и ожидалось не проблема после обновления системы jvm и т. Д.

Ответы [ 3 ]

1 голос
/ 04 декабря 2009

Вы не говорите, что это за тип "c", но я подозреваю, что его установщик не делает то, о чем вы думаете - NullPointerException указывает на неправильную автоматическую распаковку. Само перечисление не вызывает проблем, хотя возвращение Long, когда член long, является запахом кода.

На самом деле, вызов c.setComponentTypeId() с идентификатором enum - это еще один запах кода. Почему вы не используете сам enum с c.setComponentType()? То, как вы это делаете, в значительной степени теряет всю ценность перечислений.

0 голосов
/ 04 декабря 2009

Где вы инициализируете c? Я подозреваю, что это проблема и что полученное вами исключение NullPointerException на самом деле исходит от вызова setComponentTypeId, а не от получателя.

Используя ваш код для перечисления (без изменений), я запустил следующее:

ComponentTypes c = ComponentTypes.PDIFF;
c.setComponentTypeId(ComponentTypes.TADJ.getId());
System.out.println(c.getComponentTypeId());

c.setComponentTypeId(303L);
System.out.println(c.getComponentTypeId());

Мой вывод:

303

303

Тем не менее, Если c не инициализирован должным образом, вы получаете NullPointerException, когда вы пытаетесь вызвать c.setComponentTypeId в первый раз.

0 голосов
/ 04 декабря 2009

В тесте вы говорите, что вызываете setComponentId, но не указали источник для этого метода. Вы можете вставить это, а также показать, как создается объект 'c' в тесте?

Том, если они используют версию недавнего Java, поддерживающую автобокс, безусловно, long / Long, не имеет значения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...