Это плохая идея использовать тип объекта (Long) в качестве типа параметра? - PullRequest
0 голосов
/ 16 декабря 2018

Скажем, функция setX определяется следующим образом:

public void setX(Long l) {
   .....
   .....
}

Если функция вызывается с нулевым значением в параметре, что произойдет?Вызовет ли это исключение NPE, если мы выполняем автоматическую распаковку где-нибудь в функции?

Можем ли мы сказать, что в качестве практики, которая является плохой практикой, является плохой практикой использовать Long в качестве параметра функции, и вместо этого всегда следует использоватьдолго?

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

Нет, это неплохая идея!

  • Используйте long, когда ваш метод не принимает null.
  • Используйте Long, когда ваш метод принимаети правильно работает с null.

Лично я стараюсь избегать нулевых проверок, поэтому я использую long, когда могу.

public void setX(Long l) {}
public void setY(long l) {}

client:

setX(1L); // OK - use long as parameter's value -> autoboxing to Long
setX(new Long(1L));  // OK - use Long as parameter's value
setX(null);  // OK - use null as parameter's value -> Long is Object and null is correct value

setY(1L); // OK - use long as parameter's value
setX(new Long(1L));  // OK - use Long as parameter's value -> autounboxing to long
setX(null);  // Compile time error - use null as parameter's value -> long is not an Object and null is not correct value
0 голосов
/ 16 декабря 2018

Тот факт, что вы задаете этот вопрос, подразумевает, что у вас нет особой необходимости передавать null.(Потому что если вам нужно передать его, то long просто не применимо!)

Итак, при условии, что вам не нужно пропускать null, longпредпочтительнее Long по следующим причинам:

  1. С Long всегда есть возможность NPE, если null передан неожиданно.И если вы проверяете на null, чтобы избежать NPE, и находите null ... что вы тогда делаете?(Ответ: вероятно, вы не должны тестировать!)

  2. Для упаковки и распаковки Long требуются небольшие накладные расходы по сравнению с передачей и использованием long.

  3. Long в большинстве случаев занимает больше места в куче, чем long.


0 голосов
/ 16 декабря 2018

Если вы автоматически распакуете Long в long без проверки на ноль, вы получите NullPointerException.

Использование Long вместо long имеет смысл, если ваш метод обрабатываетnull значений переданы ему.Если вы никогда не собираетесь передавать null, вам следует использовать long.

. Если вы используете Java 8 или выше, вы также можете использовать OptionalLong.

Если ваш методявляется установщиком (т.е. устанавливает значение некоторой переменной экземпляра), как подразумевается именем setX, для аргумента в Long будет иметь смысл только, если соответствующая переменная экземпляра также Long (при условии, что эторазрешено быть null).

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