2012-04-27 7 views
14

En Scala cuando declara un valor o una var, Scala generará automáticamente un campo privado y los getters y setters para usted cuando se compile en bytecode.Scala: ¿Puedo declarar un campo público que no generará getters y setters cuando se compile?

E.g.

class myClass { 
    val name = "My Name" 
} 

compilará para crear el equivalente

class myClass { 
    private string name; 
    public string name(); 
    public void name_$eq(string); 
} 

Donde nombre() y name_ $ eq son los captadores y definidores para el nombre de la cadena privada.

Sé que puede obligarlo a no proporcionar los getters y setters para campos privados declarándolos como privados [this] val/var blah, pero necesito poder crear un campo público que no genere getters y setters cuando se compila.

¿Esto es posible incluso en Scala?

Gracias

+3

No crea un setter para vals –

Respuesta

8

La clase generada no contiene getters o setters como puede verse en la muestra que ya ha proporcionado. Las clases generadas no contienen getters o setters de beans Java. Para hacer realmente que el compilador genere los métodos getX y setX para un var, debe anotar esa variable con @BeanProperty.

Si desea tener un campo público accesible desde Java, creo que lamentablemente no tiene suerte. Por lo menos, no he visto una forma de lograr eso solo usando Scala.

Puede lograrlo mezclando scala y java. Con una clase Java como:

public abstract class JavaClassWithPublicField { 
    public String name = "My name"; 
} 

Y luego, en su código Scala heredan esa clase:

class ScalaClassWithPubilcField extends JavaClassWithPublicField 

Eso es probablemente la manera más limpia de hacerlo.

+0

Respuesta actualizada desde que me di cuenta de que podría resolver el problema mezclando java y scala. –

+3

Un "getter" no es un método llamado 'getX', ni un" setter "es un método llamado' setX'. Java tiene esa convención para getters y nombres de setters debido a las limitaciones sintácticas del lenguaje. Scala no tiene, y el getter se llama 'x' mientras que el setter se llama' x_ = '(o' x_ $ eq' como se ve desde Java). –

+0

Gracias por la aclaración @ DanielC.Sobral alteré las respuestas un poco para hacer esa distinción más clara. Aunque la primera parte podría ser un tema ahora ... –

3

Presumiblemente, desea forzar la forma en que se representa su atributo porque está accediendo desde Java. (Si está tratando de "optimizar" su código de bytes deshaciéndose del absorbente, entonces está perdiendo el tiempo, la VM los alineará rápidamente). Desafortunadamente para usted, mantenga la puerta lo más abierta posible para el futuro. mejoras, las especificaciones de Scala don't specify how Scala code should be translated to byte code. Esto significa que incluso si encuentra un truco que funciona para una versión determinada de Scala, no se garantiza que funcione en versiones posteriores.

El enfoque recomendado en estos casos es escribir el código Java-visible en Java y luego tener una pequeña clase de cola escrita en Scala; algo así como la respuesta dada por @Emil es genial.

Cuestiones relacionadas