2010-12-16 28 views
12

Es posible definir sealed clases en Scala, que son básicamente final excepto si la subclasificación ocurre en el mismo archivo.¿Se aplican las clases selladas en Java y, en caso afirmativo, cómo?

Parece que la JVM no admite final clase bytecode y subclases de ella.

Teniendo en cuenta que no hay una "noción" de archivo fuente en el bytecode, ¿cómo se aplica esta restricción?

Por lo tanto, ¿cómo puede javac evitar que una clase Scala sealed sea subclasificada en Java?

+0

Por lo tanto, para aclarar, se pregunta si es posible tener clases 'selladas' en código Scala ejecutadas en una JVM (** no ** si es posible, en el lenguaje Java *), tener algo similar a 'clases selladas'). ¿Derecha? –

+0

¿Qué quiere decir con "Parece que la JVM no permite el bytecode de clase final"? ¿No hay bytecode marcando una final de clase? – pedrofurla

+0

@pedrofurla: ¿AFAIK la JVM no permite subclases de clases marcadas como 'final' en el bytecode? ¿O esta restricción solo se aplica en 'javac'? – soc

Respuesta

15

La restricción se aplica a Scala source por scalac en tiempo de compilación. Las definiciones de clases binarias resultantes no tienen configurado el marcador final de las JVM, por lo que, como ya habrá adivinado, la restricción sellada no será impuesta por javac cuando las fuentes Java se compilan contra los binarios de Scala.

+0

¿Sería posible (por ejemplo, mediante un chequeo de paquete en el constructor 'clase sellada ') aplicarlo en Java/JVM, incluso si solo está en tiempo de ejecución? – Adowrath

1

¿Qué le parece usar un constructor privado para la clase que le gustaría sellar, y luego crear clases internas estáticas finales internas que amplíen esa clase. Luego obtienes un conjunto fijo de subclases en tiempo de compilación que no se puede extender más. La clase base con el constructor privado posteriormente sirve como un camino para llegar a esas clases internas, pero en sí mismo es imposible de ampliar e implementar en otro lugar.

Cuestiones relacionadas