Static inner classes in scala

前端 未结 5 1410
旧时难觅i
旧时难觅i 2020-12-28 14:03

What is the analog in Scala of doing this in Java:

public class Outer {
  private Inner inner;

  public static class Inner {
  }

  public Inner getInner()          


        
相关标签:
5条回答
  • 2020-12-28 14:30

    In scala if you need to create a some static methods you can use a companion object, with the same name of the class, where you store all the pseudo static methods. Ex:

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

    Then you can just use A.xpto.
    Try to read more about companion modules on scala

    0 讨论(0)
  • 2020-12-28 14:31

    From scala-lang:

    there is no notion of 'static' members in Scala. Instead, Scala treats static members of class Y as members of the singleton object Y

    So it seems you could have a class defined inside an Object, but not a static class defined inside a class.

    0 讨论(0)
  • 2020-12-28 14:32

    Not sure I fully understood your use case... If it can help you, objects inside classes are visible like an instance's fields, e.g.

    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)
    

    Moreover, you can perfectly override a parent's val with object:

    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 讨论(0)
  • 2020-12-28 14:41

    You can do something like this if don't need access to the outer class in the inner class (which you wouldn't have in Java given that your inner class was declared static):

    object A{
        class B {
            val x = 3
        }
    }
    class A {
        // implementation of class here
    }
    println(new A.B().x)
    
    0 讨论(0)
  • 2020-12-28 14:47

    As others have pointed out, "static" classes should be placed inside the companion object.

    In Scala, classes, traits, and objects which are members of a class are path-dependent. For example:

    class Button {
      class Click
    }
    
    
    val ok = new Button
    val cancel = new Button
    
    val c1 = new ok.Click
    val c2 = new cancel.Click
    

    Now c1 and c2 are instances of -different- classes. One class is ok.Click, and the other is cancel.Click. If you wanted to refer to the type of all Click classes, you could say Button#Click.

    0 讨论(0)
提交回复
热议问题