web-dev-qa-db-ja.com

scalaの静的内部クラス

Javaでこれを行うScalaのアナログは何ですか?

public class Outer {
  private Inner inner;

  public static class Inner {
  }

  public Inner getInner() { return inner; }
}

特に、内部クラスにnot完全修飾名を付ける必要があります-つまり、Trade.TypeTradeTypeではありません。したがって、Scalaでは、次のようなものになると思いました。

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

しかし、これは機能していないようです。myscala InnerOuterクラスの外部からは見えないようです。もちろん1つの解決策があります。 be:

class Inner
class Outer(val inner: Inner)

これは問題ありませんが、私のクラスの名前のため、Innerは実際にはOuterの「タイプ」であり、Outerは実際には長い名前を持っています。そう:

class SomeHorriblyLongNameType
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType)

これは冗長で恐ろしいことです。 SomeHorriblyLongNameTypeTypeだけに置き換えることはできますが、その場合、それと関連するクラスとの間に明確な関係はありません。ふぅ

36
oxbow_lakes

内部クラスの外部クラスにアクセスする必要がない場合は、次のようにすることができます(内部クラスがstaticと宣言されている場合、Javaにはありません))。

_object A{
    class B {
        val x = 3
    }
}
class A {
    // implementation of class here
}
println(new A.B().x)
_
38
agilefall

他の人が指摘しているように、「静的」クラスはコンパニオンオブジェクト内に配置する必要があります。

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と言うことができます。

25
Jorge Ortiz

scala-langから

scalaには「静的」メンバーの概念はありません。代わりに、Scalaは、クラスYの静的メンバーをシングルトンオブジェクトYのメンバーとして扱います

したがって、オブジェクト内にクラスを定義することはできますが、クラス内に静的クラスを定義することはできないようです。

6
skaffman

ユースケースを完全に理解したかどうかはわかりません...それが役立つ場合は、クラス内のオブジェクトがインスタンスのフィールドのように表示されます。

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)
1

scalaで、いくつかの静的メソッドを作成する必要がある場合は、クラスと同じ名前のコンパニオンオブジェクトを使用して、すべての疑似静的メソッドを格納できます。例:

class A {
}

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

次に、A.xptoを使用できます。
scalaのコンパニオンモジュールについてもっと読んでみてください

1
Hugo Delgado