2011-12-09 13 views
18

A Stringis-aCharSequence. Wiele metod w bibliotece Java akceptuje CharSequence, czyli they operate more generally. Niektóre classe mają metodę String (na przykład Writer.write(String)), a także implementują Appendable z równoważną metodą CharSequence (na przykład Writer.append(CharSequence)).Wybór między CharSequence i String dla API

Jeśli piszę klasę, która deleguje do takiej klasy, ands potrzebuje trochę tekstu, mogę wybrać dla tego wejścia String lub . Wybranie tej opcji powoduje, że klasa jest bardziej elastyczna, dając klientowi więcej opcji. Ale nie widzę wiele kodu, który to robi: argumenty tekstowe są prawie zawsze niezmienione, a nie String, a nie CharSequence. Czy jest jakiś minus w używaniu CharSequence? Czy istnieje uderzenie wydajności? Czy jest to tylko programator intertia lub ignorancja, która powoduje użycie String zamiast CharSequence?

Porównaj

class XMLWriter { 
    private final Writer writer; 

    // more stuff here 

    public void writeComment(String text) { 
     writer.write("<!-- "); 
     writer.write(text); 
     writer.write(" -->"); 
    } 
} 

z

class XMLWriter { 
    private final Writer writer; 

    // more stuff here 

    public void writeComment(CharSequence text) { 
     writer.write("<!-- "); 
     writer.append(text); 
     writer.write(" -->"); 
    } 
} 
+0

Twoja logika ma dla mnie wiele sensu. Korzystając z CharSequence, możesz zezwolić na kod wywołujący StringBuffer/StringBuilder bez potrzeby wywoływania toString() na nim - co zdarza się bardzo często. – Andy

+0

@Andy tak, miałem na uwadze 'StringBuilder' kiedy napisałem pytanie. – Raedwald

+0

Zobacz późniejsze powielenie tego pytania, [Kiedy używać CharSequence w interfejsie API] (http://stackoverflow.com/q/13234584/642706). –

Odpowiedz

13

Zgodnie javadoc z CharSequence

Ten interfejs nie dopracowania ogólnych umów o równości i metody hashcode. Wynik porównania dwóch obiektów, które implementują parametr CharSequence, jest zatem na ogół niezdefiniowany. Każdy obiekt może być zaimplementowany przez inną klasę i nie ma żadnej gwarancji, że każda klasa będzie w stanie testować swoje wystąpienia pod kątem równości z tymi z drugiej. Dlatego niewłaściwe jest używanie arbitralnych instancji CharSequence jako elementów zestawu lub kluczy w mapie.

Dlatego IMO Musimy pomyśleć dwa razy przed użyciem CharSequnce jako zamiennikiem String.

+0

Czy można powiedzieć, że metody, które jedynie wyprowadzają tekst, takie jak mój przykład, powinny używać 'CharSequence' zamiast' String'? – Raedwald

Powiązane problemy