Дизайн языка Java с toString

Мы приняли решение не реализовывать метод toString для int[], а вместо этого позволить ему наследовать метод toString от Object?


person Christian    schedule 23.07.2010    source источник
comment
В случае, если вам нужна функциональность … вы знаете о java.util.Arrays.toString …?   -  person Konrad Rudolph    schedule 23.07.2010
comment
@Konrad, но использование служебного класса - плохой выбор дизайна, ИМХО, просто прагматичный.   -  person Peter Lawrey    schedule 23.07.2010
comment
@Peter: я не защищал это. Насколько я понимаю, Java — это серия неудачных дизайнерских решений.   -  person Konrad Rudolph    schedule 24.07.2010
comment
@ Конрад, за 16 лет ты обязательно заработаешь несколько. Не все согласны с тем, как лучше их исправить. ;)   -  person Peter Lawrey    schedule 28.07.2010


Ответы (4)


Они реализовали более разумные методы toString для массивов. Они находятся в классе java.util.Arrays.

Что касается рассуждений. Я предполагаю, что из-за переопределений, предоставленных в классе Arrays, попытка реализовать общий toString для разных типов массивов либо сложна, либо невозможна. Метод toString должен знать, с каким типом массива он работает, и соответствующим образом выводить данные. Например, Object[] должен использовать toString для каждого элемента, а char[] должен выводить символ, а числовые типы данных должны быть преобразованы в числовую строку.

Методы в Arrays получают это бесплатно, потому что типы фиксированы благодаря переопределениям.

person jdmichal    schedule 23.07.2010
comment
На самом деле изменить Object, чтобы иметь разумный toString() для массивов, довольно просто, просто не рекомендуется. Еще лучше, если у int[] есть свой класс, и он знает, что его тип может просто делать то, что делает toString(int[]). - person Peter Lawrey; 23.07.2010
comment
changing Object to have a sensible toString() for arrays? Вы предлагаете исправить исходный код солнца? - person Sean Patrick Floyd; 23.07.2010
comment
Sun постоянно исправляет и выпускает исходный код, Java 6 обновлен до версии 21. - person Peter Lawrey; 28.07.2010

Я думаю, из-за следующих рассуждений: как они узнают, как пользователи захотят представить свой массив? Это может быть «размер массива: 10» или «[x, y, z]».

Они дали вам значение по умолчанию, если вы хотите сделать что-то другое, это легко сделать.

Вы можете использовать apache ToStringBuilder, чтобы упростить...

http://commons.apache.org/lang/api/org/apache/commons/lang/builder/ToStringBuilder.html

person hvgotcodes    schedule 23.07.2010
comment
Не только это, но и вызов toString() для массива со 100 000 элементов может иметь катастрофические последствия. И цель toString() заключается не только в отображении содержимого объекта, но и в отображении удобочитаемой формы для отображения в инструментах, отладчиках и т. д. - person matt b; 23.07.2010

Я предполагаю, что, поскольку объекты Array не были созданы в исходном коде Java разработчиками языка, они созданы компилятором Java. Помните, что у вас может быть массив любого типа объекта, поэтому компилятор создает объект Array в соответствии с требуемым типом.

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

По общему признанию, это раздражает, и иногда я думаю, что что-то вроде "Array[" + size + "] of " + getClassName() было бы намного лучше, чем по умолчанию.

person Dave Webb    schedule 23.07.2010

Тут немного догадок, но...

Не существует очевидного строкового представления массива int. Люди делают это по-разному: через запятую, через пробел, заключают в квадратные или круглые скобки или никак. Это, вероятно, привело к решению не реализовывать его в Java 1.1, наряду с тем, что он является кодом с низким приоритетом (поскольку любой может очень просто реализовать метод для записи массива в виде строки).

Теперь вы не можете обновить его до Java 1.2 или более поздней версии, потому что это нарушило бы совместимость для тех, кто уже использует старое поведение. Однако вы можете добавить служебный класс, который реализует некоторые функции, и это то, что они сделали с java.util.Arrays.

person DJClayworth    schedule 23.07.2010