2009-07-01 20 views
34

Was die analogen in Scala ist dies in Java zu tun:Statische innere Klassen in scala

public class Outer { 
    private Inner inner; 

    public static class Inner { 
    } 

    public Inner getInner() { return inner; } 
} 

ich meine innere Klasse will speziell auf nicht habe einen voll qualifizierten Namen haben - also ich Trade.Type will, nicht TradeType. So in Scala stellte ich mir es so etwas wie sein könnte:

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

Aber das scheint nicht zu funktionieren: meine scala Inner scheint nicht nur von außerhalb der Outer Klasse sichtbar zu sein. Eine Lösung wäre natürlich:

class Inner 
class Outer(val inner: Inner) 

das ist ok - aber wegen der Namen meiner Klassen, Inner ist wirklich der „Typ“ der Outer und Outer hat tatsächlich einen langen Namen. Also:

class SomeHorriblyLongNameType 
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType) 

Welches ist ausführlich und schrecklich. Ich könnte SomeHorriblyLongNameType durch nur Type ersetzen, aber es würde dann keine offensichtliche Verbindung zwischen ihr und der Klasse geben, mit der sie verwandt war. Puh

Antwort

35

Sie können etwas tun, wenn sie keinen Zugriff auf die äußeren Klasse in der inneren Klasse müssen (die Sie nicht in Java gegeben, dass Ihre innere Klasse static wurde erklärt hätte):

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

From scala-lang:

gibt es keinen Begriff der 'statischen' Mitglieder in Scala. Stattdessen behandelt Scala statische Member der Klasse Y als Mitglieder des Singleton-Objekt Y

So scheint es eine Klasse innerhalb eines Objekts definiert haben könnte, aber nicht eine statische Klasse innerhalb einer Klasse definiert.

+0

Wenn Sie ein Objekt innerhalb einer Klasse in Scala deklarieren, ist es dann von außerhalb dieser Klasse nicht sichtbar (oder ich konnte nicht herausfinden, wie man es macht). Ihre Antwort ist nicht ganz das, was ich frage: Ich wurde gefragt, wie ich etwas in Scala tun konnte, im Gegensatz zu fragen, wie Scala behandeln würde Java Statik –

+0

I erweitert habe auf der orig qn –

25

Wie andere bereits erwähnt haben, sollten "statische" Klassen innerhalb des Companion-Objekts platziert werden.

In Scala sind Klassen, Merkmale und Objekte, die Mitglieder einer Klasse sind, pfadabhängig. Zum Beispiel:

class Button { 
    class Click 
} 


val ok = new Button 
val cancel = new Button 

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

Nun sind c1 und c2 Instanzen von -unterschiedlichen Klassen. Eine Klasse ist in Ordnung.Klicken Sie, und die andere ist cancel.Click. Wenn Sie auf den Typ aller Click-Klassen verweisen möchten, können Sie Button # klicken.

+5

Diese Klasse ist Innen aber nicht statisch –

1

Nicht sicher, dass ich Ihren Anwendungsfall vollständig verstanden habe ... Wenn es Ihnen helfen kann, sind Objekte innerhalb von Klassen wie die Felder einer Instanz sichtbar, z.

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) 

Darüber hinaus können Sie perfekt ein Elternteil val mit dem Objekt außer Kraft setzen:

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

In scala, wenn Sie ein paar statische Methoden erstellen müssen Sie ein Begleitobjekt, mit dem gleichen Namen des verwenden können Klasse, in der Sie alle pseudostatischen Methoden speichern.Bsp .:

class A { 
} 

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

Dann können Sie einfach A.xpto verwenden.
Versuchen Sie, mehr über Companion Module auf der Scala zu lesen