2010-08-02 23 views
7

Duplicar posibles:
Why is String final in Java?¿Por qué la clase String es definitiva?

Hay varios momentos en mi vida de programación que deseaba el la clase String no había sido definitiva/sellado/NotInheritable.

Lo que los arquitectos del lenguaje intentan evitar que haga es poner en juego una llave inglesa.

Por el contrario, ¿cuáles son las llaves inglesas que los arquitectos del lenguaje querrían evitar que me impusiera al restringirme la extensión de la clase String?

¿Podría enumerar una lista de pros y contras de la clase de cadena extensible?

+0

Me doy cuenta de que hay otras clases como los numéricos que también están sellados. Podríamos comenzar analizando String primero, pero sus comentarios no necesitan estar restringidos a String. –

+0

+1 ... También quería una vez en mi vida extender la clase String, aunque no recuerdo por qué –

+0

Como mencionó java (etiqueta), esto se ha preguntado antes: http://stackoverflow.com/questions/2068804/why-is-string-final-in-java –

Respuesta

5

La cadena es immutable class lo que significa que no puede modificar su estado después de crearla. Si pudieras modificar una cadena después de haber ingresado en otra biblioteca, o un Mapa por ejemplo, el resultado sería impredecible.

Un error de la API de Java es que BigInteger y BigDecimal no son definitivos, lo que significa que debe realizar una copia defensiva de estos objetos cuando los recibe del código no confiable. Por el contrario, siempre puedes confiar en que un String se mantendrá constante.

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

Lo mismo no es posible con String. Como se indica en Effective Java, es necesario hacer copias de defensa de estos tipos de objetos:

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

Elaborado, pls. –

+1

Asegúrese de conocer la diferencia entre la palabra clave * final * y la palabra clave * sealed *. Las clases marcadas * final * TAMBIÉN * están efectivamente selladas *, pero ese no es el verdadero punto de la palabra clave * final *. Una clase * final * es ** inmutable **, lo que significa que no se puede modificar después de creada. Las clases inmutables también deben sellarse, de lo contrario, uno podría heredar, anular y agregar un comportamiento no inmutable. Las cadenas son inmutables en Java porque las cadenas mutables son ** peligrosas ** y, francamente, tienen más problemas de los que merecen. La mayoría de los lenguajes modernos (Python, Javascript, C#, Java) usan cadenas inmutables. – Ender

4

cadena es definitiva, ya que representa un tipo de dato inmutable. La terribilidad del bloque sería el resultado de extender Cadena ingenuamente porque hay muchas bibliotecas que dependen de la inmutabilidad de los objetos Cadena.

Extendiendo La cadena para hacerla mutable sería invisible para cualquier código que atraviese Sting, pero tendría efectos secundarios muy desagradables y desagradables como por ejemplo no poder cargar valores de HashMaps aunque literalmente tengas el String of the String del clave ya que el hashCode habría sido secuestrado.

+0

Si quisiera usar String para las claves de un mapa, usaría String. Si quería usar una cadena extendida como clave para un mapa, eso es exactamente lo que quiero hacer, para evitar que se acceda a ella con los objetos de cadena base. El argumento de la inmutabilidad no parece contener el agua para mí. –

+0

Pero una cadena extendida * sería * una cadena. Entonces podrías usarlo como la clave de un mapa de String. No poder derivar no le impide escribir una clase que amplíe las capacidades de String (usando composición). Simplemente evita que hagas instancias de esa clase en Strings. – jwg

Cuestiones relacionadas