Подтвердить что ты не робот

Почему в java есть много дублирующих методов?

Я играл с Java, поскольку планирую перейти от С# к нему в кросс-платформенных целях. Я только что заметил, что у него много методов, которые просто делают то же самое. И я просто хочу знать, почему они это сделали?

В примере булевский класс имеет два метода, делающих то же самое в дополнение к конструктору, который делает то же самое.

Boolean b = new Boolean(true);
Boolean b = new Boolean("true");
Boolean b = Boolean.parseBoolean(true);
Boolean b = Boolean.parseBoolean("true");
Boolean b = Boolean.valueOf(true);
Boolean b = Boolean.valueOf("true");

И я могу получить логическое значение либо путем вызова самой переменной (b), либо метода b.booleanValue(). Кто-нибудь захочет вызвать метод, получающий логическое значение логического, хотя он может просто вызвать эту переменную?

В чем смысл?

4b9b3361

Ответ 1

new Boolean (true) и Boolean.valueOf(true) return Вложенные примитивы... реальные объекты, которые могут использоваться в коллекциях и т.д. из примитивных логических значений.

Boolean.parseBoolean( "true" ) возвращает примитивное логическое значение.

Кстати,

Boolean b = Boolean.parseBoolean(true);
Boolean b = Boolean.parseBoolean("true");

действительно являются ошибками. вы создаете примитивный логический, а затем автоматический бокс для Boolean.

Вместо этого вы должны использовать valueOf (true) или valueOf ( "true" ).

Таким образом, реальное использование этих методов было бы

Boolean b = new Boolean(true);   //really this should never be used **
Boolean b = new Boolean("true"); //really this should never be used **
boolean b = Boolean.parseBoolean(true);
boolean b = Boolean.parseBoolean("true");
Boolean b = Boolean.valueOf(true);
Boolean b = Boolean.valueOf("true");

** не используйте это, поскольку вы просто создаете объекты без необходимости. using valueOf позволяет повторно использовать существующие логические объекты. Поскольку булевы неизменяемы, это прекрасно.

Ответ 2

  • Иногда вам нужно разобрать строку на примитив Boolean.parseBoolean(*String*)
  • Иногда вам нужно разобрать String на Boolean Boolean.valueOf(*String*)
  • Иногда вам не нужно создавать новый объект. Лучше избегать использования new
  • Иногда вам нужен объект Boolean вместо примитивного Boolean.valueOf(*boolean*)

Это не то же самое.

Ответ 3

Они не являются дублирующими методами/конструкторами, если вы заметили разницу между true и "true". true означает примитивный тип boolean в Java, но "true" означает объект java.lang.String, который имеет значение "true".

Ответ 4

вы пропустили самый забавный

Boolean.getBoolean("true")

Ответ 5

В чем смысл?

Ну, дело в том, что некоторые из этих альтернатив полезны, а некоторые - старые методы, оставшиеся от первой версии Java.

(Первоначальная версия Java была выпущена в спешке, и в API было несколько ошибок/несоответствий дизайна. Однако всеобъемлющее требование поддерживать обратную совместимость означало, что их было невозможно исправить. ошибки были положительно вредны, соответствующие методы были отмечены как "устаревшие", чтобы предупредить программистов не использовать их. В таких безобидных случаях, когда методы просто избыточны, все оставлено без изменений.)

Ответ 6

Обратите внимание, что они не совпадают; одна из ваших строк:

Boolean b = Boolean.parseBoolean(true);

даст синтаксическую ошибку (по крайней мере, согласно Java 6 api).

Boolean.valueOf(true) и new Boolean(true) - разные функции, поскольку new Boolean(true) создаст новый объект, а Boolean.valueOf(true) возвращает сохраненный объект Boolean.

Подпись Boolean.parseBoolean возвращает примитивное логическое значение. Перед Java 5 вам понадобилось Boolean.valueOf, чтобы преобразовать его в объектную форму. После Java 5 система сделает это автоматически, но (а) Java решила, что ей нужны явные формы автобоксинга (и, таким образом, добавлены Integer.valueOf и т.д.), И (b) методы Java никогда не удаляются, даже когда они устаревают. Во многих случаях это является источником самого дублирования (например, когда они реорганизовали коллекции обратно в Java 2, но старые классы коллекции добавляли методы, соответствующие новой системе, ведущей к дублированию).

Ответ 7

Boolean - это тип, который использует объект Object, в противоположность b.booleanValue(), который возвращает примитивный тип boolean.

поэтому разница в том, что первый объект, а второй - примитивный тип.

Ответ 8

Вы указали тот, который не существует, и вы неправильно указали тип возврата parseBoolean. Список на самом деле:

  • Boolean b = new Boolean(true);
  • Boolean b = new Boolean("true");
  • boolean b = Boolean.parseBoolean("true");
  • Boolean b = Boolean.valueOf(true);
  • Boolean b = Boolean.valueOf("true");

(4) является избыточным с (1) и (5) является избыточным с (2). Кроме двух конструкторов и двух методов. Я подозреваю, что эта функциональность из методов, а не из конструктора может быть полезна чему-то (фабрики?).

java.lang.Boolean