Почему в Java много дублирующих методов? - PullRequest
13 голосов
/ 18 апреля 2011

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

Например, у логического класса есть два метода, которые делают то же самое в дополнение к конструктору, который тоже делает то же самое.

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

Какой смысл?

Ответы [ 8 ]

29 голосов
/ 18 апреля 2011

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

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

Кстати,

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

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

Вместо этого следует использовать 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");

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

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

Это не одно и то же.

1 голос
/ 18 апреля 2011

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

Boolean b = Boolean.parseBoolean(true);

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

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

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

1 голос
/ 18 апреля 2011

Какой смысл?

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

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

1 голос
/ 18 апреля 2011

ты пропустил самое смешное

Boolean.getBoolean("true")
1 голос
/ 18 апреля 2011

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

0 голосов
/ 18 апреля 2011

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

  1. Boolean b = new Boolean(true);
  2. Boolean b = new Boolean("true");
  3. boolean b = Boolean.parseBoolean("true");
  4. Boolean b = Boolean.valueOf(true);
  5. Boolean b = Boolean.valueOf("true");

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

java.lang.Boolean

0 голосов
/ 18 апреля 2011

Boolean - это тип, который наследуется от Object, в отличие от b.booleanValue (), он возвращает логический тип примитива.

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

...