静态内部类在阶(Static inner classes in scala)

2019-06-24 16:12发布

什么是Java中这样做的斯卡拉模拟:

public class Outer {
  private Inner inner;

  public static class Inner {
  }

  public Inner getInner() { return inner; }
}

我特别希望我的内部类不是必须有一个完全合格的名称-即我想Trade.Type ,不TradeType 。 因此,在斯卡拉我想象它可能是这样的:

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

但是,这似乎并没有工作:我的斯卡拉Inner似乎没有从外部可见Outer类。 当然,一种解决办法是:

class Inner
class Outer(val inner: Inner)

这是确定-但因为我的课的名字, Inner真的是在“类型” OuterOuter居然有很长的名字。 所以:

class SomeHorriblyLongNameType
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType)

这是冗长,太可怕了。 我可以取代SomeHorriblyLongNameType只需Type但随后会有它和它相关的类之间没有明显的联系。 表示不快

Answer 1:

你可以做这样的事情,如果没有需要访问外部类中的内部类(这你就不必在Java中考虑到你的内部类被声明static ):

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


Answer 2:

正如其他人所指出的那样,“静态”类应放在同伴对象内。

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-类的实例。 一类是ok.Click,另一个是cancel.Click。 如果你想指的是所有点击类的类型,你可以说按钮#点击。



Answer 3:

从斯卡拉琅 :

没有Scala的“静态”的成员概念。 相反,斯卡拉把Y类的静态成员作为单一对象的Y的成员

这么看来,你可以有一个对象中定义的类,而不是一个类的内部定义的静态类。



Answer 4:

不知道我完全理解你的使用情况......如果它可以帮助你,里面的对象类是像一个实例的领域,例如可见

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)

此外,你可以完全覆盖父母的VAL与对象:

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)


Answer 5:

在Scala中,如果你需要创建你可以使用一个同伴对象,带班,在那里你存储所有的伪静态方法的名称相同的一些静态方法。 例如:

class A {
}

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

然后,你可以只使用A.xpto
尝试阅读更多关于Scala的伴侣模块



文章来源: Static inner classes in scala