Javaでこれを行うScalaのアナログは何ですか?
public class Outer {
private Inner inner;
public static class Inner {
}
public Inner getInner() { return inner; }
}
特に、内部クラスにnot完全修飾名を付ける必要があります-つまり、Trade.Type
、TradeType
ではありません。したがって、Scalaでは、次のようなものになると思いました。
class Outer(val inner: Inner) {
object Inner
}
しかし、これは機能していないようです。myscala Inner
はOuter
クラスの外部からは見えないようです。もちろん1つの解決策があります。 be:
class Inner
class Outer(val inner: Inner)
これは問題ありませんが、私のクラスの名前のため、Inner
は実際にはOuter
の「タイプ」であり、Outer
は実際には長い名前を持っています。そう:
class SomeHorriblyLongNameType
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType)
これは冗長で恐ろしいことです。 SomeHorriblyLongNameType
をType
だけに置き換えることはできますが、その場合、それと関連するクラスとの間に明確な関係はありません。ふぅ
内部クラスの外部クラスにアクセスする必要がない場合は、次のようにすることができます(内部クラスがstatic
と宣言されている場合、Javaにはありません))。
_object A{
class B {
val x = 3
}
}
class A {
// implementation of class here
}
println(new A.B().x)
_
他の人が指摘しているように、「静的」クラスはコンパニオンオブジェクト内に配置する必要があります。
Scalaでは、クラス、特性、およびクラスのメンバーであるオブジェクトはパスに依存します。例えば:
class Button {
class Click
}
val ok = new Button
val cancel = new Button
val c1 = new ok.Click
val c2 = new cancel.Click
これで、c1とc2は-different-クラスのインスタンスになります。 1つのクラスはOKです。クリックし、もう1つのクラスはキャンセルします。クリックします。すべてのClickクラスのタイプを参照する場合は、Button#Clickと言うことができます。
scalaには「静的」メンバーの概念はありません。代わりに、Scalaは、クラスYの静的メンバーをシングルトンオブジェクトYのメンバーとして扱います
したがって、オブジェクト内にクラスを定義することはできますが、クラス内に静的クラスを定義することはできないようです。
ユースケースを完全に理解したかどうかはわかりません...それが役立つ場合は、クラス内のオブジェクトがインスタンスのフィールドのように表示されます。
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)
さらに、親の値をオブジェクトで完全にオーバーライドできます。
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)
scalaで、いくつかの静的メソッドを作成する必要がある場合は、クラスと同じ名前のコンパニオンオブジェクトを使用して、すべての疑似静的メソッドを格納できます。例:
class A {
}
object A {
def xpto // define some pseudo static methods here..
}
次に、A.xpto
を使用できます。
scalaのコンパニオンモジュールについてもっと読んでみてください