Очевидный ответ - вернуть Integer
вместо int
.
static Integer function(int[] arr) {
Автобокс позаботится о переносе примитива;autounboxing позаботится о предоставлении клиенту кода NullPointerException
.
Но вы сказали, что это эффективно, но выделение подлинного объекта неэффективно (для небольших значений будет использоваться общий объект, но это все же не так уж хорошо).Создание исключения было бы еще менее эффективным (предположим, что это происходит достаточно часто).
Процедура может вернуть любое значение int
, и мы хотим добавить дополнительный возможный код.Таким образом, одна возможность - увеличить значение и вернуть long
с Long.MIN_VALUE
в качестве специального значения.Может потребоваться приведение кода клиента для возврата к int
.
static Integer function(int[] arr) {
Long.MIN_VALUE
. Интересно, что Long.MIN_VALUE == Math.abs(Long.MIN_VALUE)
.
Именно в этот момент мы понимаем, что появляетсябыть ошибкой в коде (не уверен, поскольку я действительно знаю, что он должен делать).
if(Math.abs(arr[i])<closest){
Это всегда верно для Integer.MIN_VALUE
.Возможно, вы захотите поменять это на.
if (-Math.abs(arr[i]) > -closest){
Преобразование в long
перед выполнением сравнения также возможно, но менее умно.(Целочисленные переполнения - bleurgh.)
Другой способ решения этой проблемы - позволить клиентскому коду выбрать подходящее значение для сигнала, совпадающее с тем, что null
должно указывать.
static int function(int[] arr, int dflt) {
[...]
} else if (arr[i] == closest) {
return dflt;
[...]