2011-01-31 8 views
12

¿Cómo se traduciría el siguiente código Java a Scala?Mejores prácticas de variables de instancia de Scala

class ClassA { 
    private int field1; 
    private int field2; 

    public ClassA() { 
     field1 = 1; 
     field2 = 2; 
    } 
} 

Veo dos opciones:

class ClassA(val field1: Int, val field2: Int) { 
    .... 
} 

O

class ClassA { 
    val field1: Int = 1 
    val field2: Int = 2 
} 

Lo que se recomienda y por qué?

+0

Ninguna versión es equivalente, ya que ambos campos son privados en la versión de Java y públicos en las alternativas de Scala que ha mostrado. Tal vez te gustaría ser más específico sobre lo que quieres lograr? –

Respuesta

4

Si desea tener campos privados, ¿por qué no declararlos privados?

class ClassA { 
    private val field1: Int = 1 
    private val field2: Int = 2 
} 
5

La mayor diferencia entre los dos es que el parámetro de clase uno se puede usar como constructor. Si desea que el constructor no tenga parámetros, como su ejemplo de Java, entonces necesita usar el segundo, además de agregar el modificador privado como lo sugiere @Debilski.

Otra opción sería usar parámetros predeterminados en el constructor. De esa manera los campos podrían cambiarse si es necesario:

class ClassA (private val field1: Int = 1, private val field2: Int = 2) 

// Using defaults 
val a = new ClassA 

// Setting new values 
val b = new ClassA(3, 4) 
+0

Esta es una buena solución, pero no es equivalente al código Java de OP. – Raphael

+0

@ Raphael Eso es verdad. Pero como el ejemplo de Java dado parece bastante inútil en sí mismo, pensé que tal vez mostrar algunas opciones podría ser interesante :) – eivindw

1

Si siempre quiera que campo1 y campo2 tener el mismo valor para cada instancia de la clase A, sugeriría que ponerlos en un módulo compañero:

object A { 
    private val field1 = 1 
    private val field2 = 2 
} 

Y luego ellos utilizan en la clase a:

class A { 
    def complexInternalComputation = 2*A.a 
} 

o de esta manera:

class A { 
    import A._ 
    def complexInternalComputation = 2*a 
} 
+0

Esto no funciona; 'A.a' no se puede acceder desde una instancia de la clase' A', ya que es privada. – Raphael

+0

Según la especificación scala, §5.2: • El modificador privado se puede usar con cualquier definición o declaración en una plantilla. Se puede acceder a dichos miembros solo desde la plantilla que los encierra directamente y su módulo acompañante o clase acompañante (§5.4). – Nicolas

+0

Sin embargo, falla en REPL pero funciona en un archivo. – Nicolas

16

No hay simple traducción de Java a Scala, que depende del contexto:

  • son las variables mutables en Java? En caso afirmativo (de lo contrario deberían ser definitivos en Java): ¿Tendría sentido convertirlos en inmutables en Scala?
  • ¿El constructor debe permanecer público en Scala? Sería una fábrica (por ejemplo, un método de aplicación en el el objeto complementario) más apropiado?
  • ¿Por qué son las variables privadas? ¿Tienen getters y/o setters?
  • ¿Cuándo se necesitan las variables, tendría sentido hacerlas perezosas?
  • Si los valores son inmutables y expuestos, ¿serían útiles en la coincidencia de patrones? ¿Sería una clase de caso la elección correcta?
  • ¿Podrían agruparse las variables (por ejemplo, en una tupla) para simplificar la API y el acceso?

Usted ve, hay tantas consideraciones. Sugiero aprender sobre las posibilidades de Scala y jugar con diferentes enfoques, de lo contrario te quedarás atrapado en la trampa "Scala como mejor Java" más tiempo de lo necesario.

8

Ésta es la traducción más directa a Scala:

class ClassA{ 
    private var field1 = 1 
    private var field2 = 2 
} 

Nota el uso de var en lugar de val. val es un campo inmutable, que corresponde a public final en Java. Por lo tanto, no se puede cambiar más adelante y es importante proporcionar una forma de inicializar dicho campo con el valor correcto para una instancia determinada.

Para decidir lo que quiere usar, hágase las preguntas que figuran en la respuesta de Landei.

+0

No es exactamente la traducción directa: las variables privadas de Java son de clase privada, no de instancia privada, por lo que debe soltar el [este]. – Submonoid

+0

@Submonoid Gracias. Parece que siempre lo hice mal. :) – ziggystar