2010-08-02 6 views
7

Eventuali duplicati:
Why is String final in Java?Perché la classe String è definitiva?

Ci sono vari momenti della mia vita di programmazione che avrei voluto la classe String non fosse stato finale/sigillato/NotInheritable.

Quali sono gli architetti del linguaggio che cercano di impedirmi di farlo che lanciare una chiave inglese nelle opere.

Piuttosto, quali sono le chiavi inglesi che gli architetti del linguaggio vorrebbe impedirmi di partecipare alle opere limitandomi ad estendere la classe String?

Puoi elencare un elenco di pros-cons della classe di stringa estendibile?

+0

Mi rendo conto che ci sono altre classi come i numeri che sono anche sigillati finali. Potremmo iniziare analizzando String, ma i tuoi commenti non devono essere limitati a String. –

+0

+1 ... Volevo anche una volta nella mia vita estendere la classe String, anche se non ricordo perché –

+0

Come hai detto java (tag), questo è stato chiesto prima: http://stackoverflow.com/questions/2068804/why-is-string-final-in-java –

risposta

5

String è un immutable class che significa che se non è possibile modificare il suo stato dopo averlo creato. Se si potesse modificare una stringa dopo aver inserito un'altra libreria o una mappa per esempio, il risultato sarebbe imprevedibile.

Un errore dell'API Java è che BigInteger e BigDecimal non sono definitive il che significa che è necessario eseguire una copia difensiva di questi oggetti quando li ricevono da codice non attendibile. Al contrario, puoi sempre fidarti che un String rimarrà coerente.

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"); 
    } 
} 

La stessa cosa non è possibile con String. Come indicato nel Effective Java, è necessario effettuare copie di difesa di questi tipi di oggetti:

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

Elaborato, pls. –

+1

Assicurati di conoscere la differenza tra la parola chiave * final * e la parola chiave * sealed *. Le classi contrassegnate * final * sono ANCHE * effettivamente sigillate *, ma questo non è il vero punto della parola chiave * final *. Una * classe * * è ** immutabile **, il che significa che non può essere modificata dopo la creazione. Le classi immutabili devono essere anche sigillate, altrimenti si potrebbe ereditare, scavalcare e aggiungere un comportamento non immutabile. Le stringhe sono immutabili in Java perché le stringhe mutabili sono ** pericolose ** e, francamente, più problemi di quanti ne valgano. La maggior parte dei linguaggi moderni (Python, Javascript, C#, Java) usa stringhe immutabili. – Ender

4

String è definitiva perché rappresenta un tipo di dati immutabili. La spiacevole molteplicità risulterebbe dall'estensione ingenua di String perché ci sono molte librerie che dipendono dall'immutabilità degli oggetti String.

Estendere String per renderlo mutabile sarebbe invisibile a qualsiasi codice attraversato dallo Sting, ma avrebbe effetti collaterali molto sorprendenti e sgradevoli come improvvisamente non essere in grado di caricare valori da HashMaps anche se letteralmente avete la stringa del chiave poiché l'hashCode sarebbe stato dirottato.

+0

Se volessi usare String per le chiavi di una mappa, userei String. Se volessi usare una stringa estesa come chiave per una mappa, è esattamente quello che voglio fare - per impedirne l'accesso con oggetti String di base. La discussione sull'immutabilità non sembra trattenere l'acqua per me. –

+0

Ma una stringa estesa * dovrebbe * essere una stringa. Quindi potresti usarlo come chiave di una mappa da String. Non essere in grado di derivare non ti impedisce di scrivere una classe che estende le capacità di String (usando la composizione). Ti impedisce semplicemente di creare istanze di quella classe in Stringhe. – jwg