2010-08-02 9 views
7

Mögliche Duplizieren:
Why is String final in Java?Warum ist die String-Klasse endgültig?

Es gibt verschiedene Momente in meinem Leben, dass ich Programmierung die die String-Klasse gewünscht hatte nicht endgültig/versiegelt/NotInheritable gewesen.

Was die Spracharchitekten versuchen, mich daran zu hindern, würde einen Riesenschraubenzieher in die Arbeit werfen.

Eher, was sind die Affenschlüssel, die die Spracharchitekten verhindern wollen, dass sie mich in die Arbeiten werfen, indem sie mich daran hindern, die String-Klasse zu erweitern?

Können Sie eine Liste der Pros-Nachteile der erweiterbaren String-Klasse auflisten?

+0

Ich weiß, es gibt andere Klassen wie Zahlen, die auch abgeschlossen sind. Wir könnten zuerst mit der Analyse von String beginnen, aber Ihre Kommentare müssen nicht auf String beschränkt sein. –

+0

+1 ... Ich wollte auch einmal in meinem Leben die String-Klasse erweitern, obwohl ich mich nicht erinnern kann, warum –

+0

Wie Sie Java (Tag) erwähnt haben, wurde dies zuvor gefragt: http://StackOverflow.com/Questions/2068804/why-is-string-final-in-java –

Antwort

5

String ist ein immutable class was bedeutet, wenn Sie seinen Zustand nicht ändern können, nachdem Sie es erstellt haben. Wenn Sie eine Zeichenfolge ändern könnten, nachdem sie in eine andere Bibliothek oder eine Karte eingegeben wurde, wäre das Ergebnis unvorhersehbar.

Ein Fehler der Java-API ist, dass BigInteger und BigDecimal nicht endgültig sind, was bedeutet, dass Sie eine defensive Kopie dieser Objekte durchführen müssen, wenn Sie sie von nicht vertrauenswürdigem Code erhalten. Umgekehrt können Sie immer darauf vertrauen, dass String konsistent bleibt.

Untrustworthy BigInteger:

public class DestructiveBigInteger extends BigInteger { 

    public DestructiveBigInteger(String value) { 
     super(value); 
    } 

    public BigInteger add(BigInteger val) { 
     return BigInteger.ONE; // add() method does not behave correctly 
    } 

    public BigInteger subtract(BigInteger val) { 
     throw new UnsupportedOperationException("subtract is broken"); 
    } 
} 

Das Gleiche ist nicht möglich, mit String. Wie in Effective Java angegeben, müssen Sie defensive Kopien dieser Arten von Objekten machen:

public void setValue(BigInteger value) { 
    this.value = new BigInteger(value.toByteArray()); 
} 
+0

Aufwendig, pls. –

+1

Stellen Sie sicher, dass Sie den Unterschied zwischen dem Keyword * final * und dem Keyword * sealed * kennen. Mit * final * markierte Klassen sind ALSO * effektiv versiegelt *, aber das ist nicht der wahre Sinn des Schlüsselworts * final *. Eine * final * -Klasse ist ** unveränderlich **, was bedeutet, dass sie nach der Erstellung nicht geändert werden kann. Unveränderbare Klassen müssen ebenfalls versiegelt sein, andernfalls könnte man etwas nicht unveränderliches Verhalten erben, überschreiben und hinzufügen. Zeichenketten sind in Java unveränderlich, weil veränderliche Zeichenketten ** gefährlich ** sind, und, offen gesagt, mehr Mühe, als sie wert sind. Die meisten modernen Sprachen (Python, Javascript, C#, Java) verwenden unveränderliche Zeichenfolgen. – Ender

4

String final ist, weil es einen unveränderlichen Datentyp darstellt. Vielfältige Schrecklichkeit würde durch die naive Verlängerung von String entstehen, da es viele Bibliotheken gibt, die von der Unveränderlichkeit von String-Objekten abhängen.

Erweitern String, um es änderbar zu machen, wäre unsichtbar für jeden Code, den der Sting durchläuft, hätte aber sehr überraschende und fiese Nebenwirkungen, wie plötzlich keine Werte von HashMaps laden zu können, obwohl Sie buchstäblich den String des Schlüssel, da der HashCode entführt worden wäre.

+0

Wenn ich String für Schlüssel einer Karte verwenden wollte, würde ich String verwenden. Wenn ich einen erweiterten String als Schlüssel für eine Map verwenden möchte, möchte ich genau das tun, um zu verhindern, dass er mit Basis-String-Objekten aufgerufen wird. Unveränderbarkeit Argument scheint nicht für mich zu halten. –

+0

Aber ein erweiterter String * wäre * ein String. Sie können es also als Schlüssel einer Karte aus String verwenden. Nicht ableiten zu können, hindert Sie nicht daran, eine Klasse zu schreiben, die die Fähigkeiten von String erweitert (mit Komposition). Es hindert Sie daran, Instanzen dieser Klasse zu Strings zu machen. – jwg

Verwandte Themen