Почему в 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(). Кто-нибудь захочет вызвать метод, получающий логическое значение логического, хотя он может просто вызвать эту переменную?
В чем смысл?
Ответы
Ответ 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