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

Почему методы класса "Arrays" все статичны в Java?

Я проходил через Java-документацию, и я узнал, что методы в классе Arrays в Java все статичны. Я действительно не понимаю причину, почему они сделали ее статичной.

Например, следующий код нарушает подход OO, потому что, если у меня есть тип "X", тогда все методы, действующие на него, должны быть внутри него:

int[] a = {34, 23, 12};
Arrays.sort(a);

Было бы лучше, если бы они реализовали следующий способ:

int[] a = {34, 23, 12};
a.sort();

Может кто-нибудь объяснить мне немного об этом?

4b9b3361

Ответ 1

В Java нет возможности расширить функционально массив. Массивы все наследуются от Object, но это дает очень мало. ИМХО Это недостаток Java.

Вместо этого, чтобы добавить функциональность для массивов, статические методы утилиты добавляются в классы типа Array и Arrays. Эти методы static, поскольку они не являются методами экземпляра.

Ответ 2

Хорошее наблюдение. Обратите внимание также, что не каждый массив может быть отсортирован. Можно отсортировать только массивы примитивов и Объекты, которые реализуют интерфейс Comparable. Таким образом, общий метод sort(), который применяется ко всем массивам, невозможен. И поэтому у нас есть несколько перегруженных статических методов для каждого поддерживаемого типа, которые на самом деле сортируются.

Обновление:

@Holger правильно указывает в комментариях ниже, что один из перегруженных статических методов действительно Arrays.sort(Object[]), но документы явно указывают:

Все элементы массива должны реализовывать интерфейс Comparable.

Таким образом, он не работает для объектов, которые не реализуют Comparable или один из его субинтерфейсов.

Ответ 3

Прежде всего, Arrays - это класс утилиты, который выполняет именно это: предоставляет статические методы. Он отделен от любых экземпляров arr[] и не имеет отношения OO к нему. Существует несколько классов, таких как Collections или различные StringUtils.

Массивы - это коллекции, они используются для хранения данных. Arrays.sort() - это алгоритм, который сортирует коллекцию. Может быть много других алгоритмов, которые сортируют данные по-разному, все они будут использоваться одинаково: MyAlgorithm.doSthWithArray(array). Даже если в массиве был метод sort() (тогда он должен был бы быть SortableArray, потому что не все объекты могут быть отсортированы автоматически), все остальные алгоритмы все равно придется называть старым способом. Если не было введенного шаблона посетителя... Но это делает вещи слишком сложными, следовательно, нет смысла.

Для java Collection там Collections.sort(), даже в С++ существует std::sort, который работает аналогично, как и qsort в C. Я не вижу здесь проблемы, я вижу последовательность.

Ответ 4

Статические методы иногда используются для служебных целей. Итак, Arrays - это класс утилиты для операций массива общего назначения. Аналогично, Collections также является классом Util, где приведены методы утилиты.

Ответ 5

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

Это, в сочетании с поддержкой обратной совместимости, означает, что массивы застряли с архаичным интерфейсом.

Это просто старая часть API.

Ответ 6

Массив не является объектом, в котором хранится состояние, за пределами фактических значений int массива. Другими словами, это просто "тупой контейнер". Он не "знает" никакого поведения.

Класс утилиты - это класс, который имеет только методы public static, которые являются функциями без состояния. Сортировка является апатридом, потому что между вызовами этого метода ничего не запоминается. Он работает "автономно", применяя его формулу к любому объекту, переданному, если этот объект "сортируемый". Второй экземпляр класса Arrays не изменил бы поведение, поэтому просто имеет экземпляр static.

Как отметил Дариуш, существуют разные способы сортировки. Таким образом, вы могли бы иметь MyArrays.betterSort(array), а также Arrays.sort(array).

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

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

И теперь вы становитесь сложнее. Может быть, массив типа T сортируется иначе, чем тип S....

Он прост с помощью статической утилиты и интерфейса Comparator<T>.

Ответ 7

Для меня это идеальное решение. У меня есть массив, и у меня есть класс, Arrays, который работает над данными в массиве. Например, вы можете захотеть сохранить некоторые случайные числа, и вы никогда не захотите сортировать или какой-либо другой метод утилиты, вы получите поведение, которое вы не хотите. Поэтому при разработке кода хорошо отделять данные от поведения.

Вы можете прочитать о принципе единой ответственности.

Ответ 8

Класс Arrays содержит методы, не зависящие от состояния, поэтому они должны быть static. Это по существу полезный класс.

В то время как принципы ООП не применяются, текущий путь более четкий, краткий и более читаемый, поскольку вам не нужно беспокоиться о полиморфизме и наследовании. Все это уменьшает объем, который в конечном итоге уменьшает вероятность того, что вы что-то вникнете.

Теперь вы можете спросить себя: "Почему я не могу расширить функциональность массива в Java?". Хороший ответ заключается в том, что этот представляет потенциальные дыры в безопасности, которые могут нарушить системный код.