2009-07-01 14 views
34

¿Cuál es el análogo en la Scala de hacer esto en Java:clases internas estáticas en Scala

public class Outer { 
    private Inner inner; 

    public static class Inner { 
    } 

    public Inner getInner() { return inner; } 
} 

Quiero específicamente mi clase interna a no tiene que tener un nombre completo - es decir, quiero Trade.Type, no TradeType. Así que en Scala me imaginaba que podría ser algo como:

class Outer(val inner: Inner) { 
    object Inner 
} 

Pero esto no parece funcionar: mi Scala Inner no parece ser visible desde fuera de la clase Outer. Una solución sería, por supuesto:

class Inner 
class Outer(val inner: Inner) 

que está bien - pero debido a los nombres de mis clases, Inner es realmente el "tipo" de la Outer y Outer en realidad tiene un nombre largo. Entonces:

class SomeHorriblyLongNameType 
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType) 

Que es verboso y horrible. Podría reemplazar SomeHorriblyLongNameType con solo Type pero no habría una conexión obvia entre él y la clase con la que estaba relacionado. Uf

Respuesta

35

Usted puede hacer algo como esto si no es necesario el acceso a la clase externa en la clase interna (que no tendría en Java, dado que su clase interna fue declarado static):

object A{ 
    class B { 
     val x = 3 
    } 
} 
class A { 
    // implementation of class here 
} 
println(new A.B().x) 
5

From scala-lang:

no hay noción de miembros 'estáticos' en Scala. En su lugar, trata Scala miembros estáticos de la clase Y como miembros del objeto Singleton Y

Por lo tanto, parece que podría haber una clase definida dentro de un objeto, pero no una clase estática definido dentro de una clase.

+0

Si declara un objeto dentro de una clase en Scala, entonces no es visible desde fuera de esa clase (o no pude encontrar la manera de hacerlo). Su respuesta no es exactamente lo que estaba preguntando: estaba preguntando cómo podía hacer algo en Scala, en lugar de preguntarle cómo trataría Scala las estáticas de Java –

+0

He expandido en el qn original –

25

Como han señalado otros, las clases "estáticas" deben colocarse dentro del objeto complementario.

En Scala, las clases, los rasgos y los objetos que son miembros de una clase dependen de la ruta. Por ejemplo:

class Button { 
    class Click 
} 


val ok = new Button 
val cancel = new Button 

val c1 = new ok.Click 
val c2 = new cancel.Click 

Ahora c1 y c2 son instancias de -different- classes. Una clase está bien. Haz clic y la otra se cancela. Haz clic. Si desea consultar el tipo de todas las clases Click, puede decir Button # Click.

+5

Esta clase es interna pero no estática –

1

No estoy seguro Entiendo completamente su caso de uso ... Si puede ayudarlo, los objetos dentro de las clases son visibles como los campos de una instancia, p.

case class C(var x: Int) 
class A { case object b extends C(0) } 
val a = new A 
println(a.b.x) 
a.b.x = 2 
println(a.b.x) 

Por otra parte, puede sustituir perfectamente val de un padre con objeto:

case class C(var x: Int) 
class A { val y: C = C(0) } 
class B extends A { override case object y extends C(2) } 
val a: A = new B 
println(a.y.x) 
0

en Scala, si es necesario crear un algunos métodos estáticos que puede utilizar un objeto acompañante, con el mismo nombre de la clase, donde almacena todos los métodos pseudoestáticos.Ejemplo:

class A { 
} 

object A { 
    def xpto // define some pseudo static methods here.. 
} 

Luego puede usar A.xpto.
Intente leer más sobre módulos complementarios en scala

Cuestiones relacionadas