Зачем вызывать методы из контейнерного класса вместо его экземпляров в Java - PullRequest
4 голосов
/ 30 марта 2019

Я пытаюсь изучить коллекции Java. Но есть особый синтаксис, который я не могу понять о вызове методов коллекции. Как .toString() или .sort() е. г. ;

Я не понимаю причину, по которой мы вызываем перечисленные ниже методы из класса Arrays или класса Collections. Для печати массивов это называется внутри println().

Arrays.toString(myArray);

Для сортировки списков

Collections.sort(myList);

А почему нет?

myArray.toString();

myList.sort();

Может ли кто-нибудь провести меня через это?

Ответы [ 5 ]

3 голосов
/ 30 марта 2019

Причины для ваших двух примеров разные:

Там нет пользовательской реализации toString в типах массива.Для MyType[].toString() разработчик не может переопределить toString() для типа массива.Вот почему помощник Arrays.toString предоставляется.Реализация toString для типов массивов - это та, что унаследована от Object, что почти всегда не очень полезно.

List.sort - это метод default в List, введенный в Java 8.До этого можно было сортировать только с помощью Collections.sort.Если вы посмотрите на источник Collections.sort, он делегирует саму сортировку List.sort.Что касается того, почему это не было в List с самого начала, то на это могут ответить только дизайнеры API.Однако одна из причин, по которой я могу придумать, - это согласованность (Collections имеет несколько методов статических коллекций, а Java не поддерживала статические методы в интерфейсах до версии 8).

1 голос
/ 30 марта 2019

Из первой строки документов :

Структура коллекций представляет собой унифицированную архитектуру для представления и управления коллекциями, позволяющую манипулировать ими независимо от деталей ихпредставление.Это уменьшает усилия программирования при одновременном повышении производительности.Это обеспечивает совместимость между несвязанными API, сокращает усилия по разработке и изучению новых API и способствует повторному использованию программного обеспечения.Фреймворк основан на более чем десятке интерфейсов коллекцииОн включает в себя реализации этих интерфейсов и алгоритмы для их манипулирования.

Цель состоит в том, чтобы уменьшить дублирование кода.В случае myList.sort() все реализации интерфейса List должны будут реализовывать функцию sort, и сортировка каждой реализации может отличаться по поведению.Но как статический метод класса Collections, реализации List не должны реализовывать функцию сортировки.С точки зрения пользователя, вы можете передать List, что вам нужно, Collections.sort() и знать, что произойдет.

Начиная с Java 8, эта функциональность могла быть реализована с помощью методов по умолчанию, что и является List.sort(comparator) делает.Методы по умолчанию позволяют всем реализациям интерфейса получать реализацию, определенную в интерфейсе, поэтому из Java 8 можно сделать myList.sort() с оговоркой, что вы должны указать ему, как сортировать, предоставивфункция сравнения.Например, если у вас есть List<Integer>: mylist.sort(Integer::compareTo).Но Collections Framework предшествует методам по умолчанию, поэтому требуется Collections.sort().

. Также как Collections.sort() и List.sort(comparator), вы также можете использовать Stream.sorted(): myList.stream().sorted().collect(Collectors.toList());

0 голосов
/ 30 марта 2019

Java toString() для массива должен вывести [, за которым следует символ, представляющий тип элементов массива , затем @, затем " идентификационный хэш-код"массива (представьте, что вы" адрес памяти ").

Чтобы получить что-то осмысленное в человеческом понимании, нужно Arrays.toString(myArray);

Массивы не переопределяют toString, есть статический метод: java.util.Arrays.toString чтобы спасти.

0 голосов
/ 30 марта 2019

Лучше использовать

Arrays.toString(myArray);

вместо

myArray.toString();

Потому что, если myArray будет нулевым, то myArray.toString () сгенерирует java.lang.NullPointerExceptionно Arrays.toString (myArray) вернет ноль.То же, что и myArray.sort ()

0 голосов
/ 30 марта 2019

Вы не можете вызывать эти статические методы непосредственно для объекта, так как аргументы не будут совпадать.Методы привязаны к классу, а не к его конкретному экземпляру, поэтому вы должны предоставить объект в качестве аргумента.Кроме того, методы делают разные вещи:

Arrays.toString(myArray);

- удобный метод для печати содержимого массива.Если вы позвоните myArray.toString(), будет напечатан хеш-код объекта.

...