2010-07-23 19 views
9

Podjęliśmy decyzję, aby nie wdrażać metody toString dla int[], ale zamiast tego pozwolić jej na dziedziczenie metody toString z Object?Projekt języka Java z toString

+5

Jeśli potrzebujesz funkcjonalności ... wiesz o 'java.util.Arrays.toString' ...? –

+0

@Konrad, ale jest to kiepski wybór, jeśli chodzi o użycie klasy użytkowej, po prostu pragmatycznego IMHO. –

+0

@Peter: Nie broniłem tego. O ile mi wiadomo, Java jest * serią * złych wyborów projektowych. –

Odpowiedz

8

Wprowadzono bardziej uzasadnione metody toString dla tablic. Znajdują się one w klasie java.util.Arrays.

Co do rozumowania. Zakładam, że przez przesłonięcia dostarczone w klasie Arrays, próba implementacji generycznego toString dla różnych typów tablic jest albo złożona, albo niemożliwa. Metoda toString musiałaby wiedzieć, na którym typie macierzy pracuje, i wyprowadzać dane w odpowiedni sposób. Na przykład Object[] musi używać toString na każdym elemencie, podczas gdy char[] musi wyprowadzać znak, a numeryczne typy danych muszą być konwertowane na ciąg liczbowy.

Metody dostępne w Arrays otrzymują za darmo, ponieważ typy są stałe z powodu nadpisań.

+1

Właściwa zmiana obiektu na sensowną toString() dla tablic jest dość prosta, po prostu niezalecana. Jeszcze lepiej int [] ma swoją własną klasę i wie, że jej typ może po prostu robić to, co robi toString (int []). –

+0

'Zmiana obiektu na sensowny toString() dla tablic'? Sugerujesz, aby poprawić kod źródłowy słońca? –

+0

Firma Sun nieustannie aktualizuje i wydaje poprawki do kodu źródłowego, Java 6 jest aktualizowana 21. –

2

Sądzę, że z powodu następującego rozumowania: skąd mieliby wiedzieć, jak użytkownicy chcieliby zaprezentować swoją tablicę? Może mieć "rozmiar tablicy: 10" lub może być "[x, y, z]".

Dali ci domyślne, jeśli chcesz zrobić coś innego, co jest łatwe.

Można użyć Apache ToStringBuilder łatwiej ...

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

+2

Nie tylko to, ale może być katastrofalne wywoływanie 'toString()' w tablicy zawierającej 100 000 elementów. A celem 'toString()' jest nie tylko wyświetlenie zawartości obiektu, ale także wyświetlenie czytelnej dla człowieka postaci wyświetlanej w narzędziach, debuggerach itp. –

2

Moje przypuszczenie byłoby to, że ponieważ obiekty Array nie zostały stworzone w kodzie źródłowym Javy przez projektantów językowych - są one tworzone przez kompilator Java. Pamiętaj, że możesz mieć tablicę dowolnego typu obiektu, więc kompilator tworzy obiekt Array odpowiednio do potrzebnego typu.

Jeśli mają stworzyć standardową metodę, nie jest od razu oczywiste, jak to powinno działać. Na przykład wykonanie toString() i konkatenacja wyników może być OK dla małej tablicy, ale nie działa dla tablicy wielowymiarowej lub tablicy z 1000 wpisów. Więc myślę, że nie ma metody toString(), aby zachować spójność wszystkich tablic.

Co prawda jest denerwujące i czasami wydaje mi się, że coś podobnego do linii "Array[" + size + "] of " + getClassName() może być znacznie lepsze niż domyślne.

+0

Pierwsza część tego, jak sądzę, uderza w to prosto w głowę. –

1

Trochę zgadywania tutaj, ale ...

Nie jest oczywiste, reprezentacja ciąg int tablicy. Ludzie robią to na różne sposoby: przecinki, oddzielone spacjami, ujęte w nawiasy lub nawiasy lub nic. Prawdopodobnie doprowadziło to do decyzji o niewdrażaniu go w Javie 1.1, wraz z kodem niskiego priorytetu (ponieważ każdy może zaimplementować metodę, aby napisać tablicę jako napis bardzo prosto).

Teraz nie można go zaktualizować w Javie 1.2 lub późniejszej, ponieważ mogłoby to zrekompensować kompatybilność dla każdego, kto już używa starego zachowania. Możesz jednak dodać klasę narzędziową, która implementuje niektóre funkcje, i to właśnie zrobili z java.util.Arrays.

Powiązane problemy