Java автоматическая распаковка - есть ли предупреждение компилятора? - PullRequest
9 голосов
/ 09 января 2010

Я большой поклонник автобокса в Java, так как он экономит много уродливого кода котельной доски. Однако я обнаружил, что автоматическая распаковка сбивает с толку в некоторых случаях, когда объект Number может быть нулевым. Есть ли способ определить, где происходит автоматическая распаковка в кодовой базе с предупреждением javac? Любое другое решение для обнаружения случаев распаковки (например, FindBugs или Eclipse-специфичное предупреждение компилятора) будет оценено, поскольку я не могу найти ни одного.

Чтобы уточнить, я не хочу, чтобы на боксе генерировались какие-либо предупреждения - только распаковка.

Вот простой пример некоторого кода, который может вызвать запутанные исключения NullPointerException:

class Test {
    private Integer value;

    public int getValue() {
        return value;
    }
}

Ответы [ 4 ]

5 голосов
/ 09 января 2010

Да. В Затмении:

Настройки-> Java-> Компилятор-> Ошибки / Предупреждения-> Потенциальные проблемы программирования-> Преобразования в бокс и распаковку

2 голосов
/ 09 января 2010

К сожалению нет. Это одна из проблем с автоматической распаковкой номеров. Вы можете

  • Инициализируйте его значением по умолчанию, таким как private Integer value = 0
  • Проверка на ноль return value != null ? value : 0

Лично я предпочитаю первый метод. В общем, я думаю, что у вас не будет слишком много случаев, когда у вас должен быть нулевой номер.

Кроме того, почему вы используете большое целое число для хранения значения. Если вы только возвращаете немного int, почему бы не сохранить его таким образом?

1 голос
/ 09 января 2010

Я сомневаюсь, что это будет предупреждение. Это одна из особенностей автобокса.

Джошуа Блох обращается к этому в своей книге «Эффективная Ява». По сути, компилятор пытается сделать для вас больше того, что ожидается. Другими словами, этот тип проблемы чаще связан с использованием, и в результате трудно «определить ошибку», так как ошибка, с семантической точки зрения, просто отсутствует.

1 голос
/ 09 января 2010

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

...