Подтвердить что ты не робот

Статические внутренние классы в scala

Что такое аналог в Scala для этого в Java:

public class Outer {
  private Inner inner;

  public static class Inner {
  }

  public Inner getInner() { return inner; }
}

Я хочу, чтобы мой внутренний класс не имел полное имя - т.е. я хочу Trade.Type, а не TradeType. Поэтому в Scala я подумал, что это может быть что-то вроде:

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

Но это, похоже, не работает: мой Scala Inner просто не кажется видимым извне класса Outer. Разумеется, одним из решений будет:

class Inner
class Outer(val inner: Inner)

Это нормально - но из-за имен моих классов Inner действительно "тип" Outer и Outer на самом деле имеет длинное имя. Итак:

class SomeHorriblyLongNameType
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType)

Это многословно и ужасно. Я мог бы заменить SomeHorriblyLongNameType только Type, но тогда не было бы очевидной связи между ним и классом, к которому он был связан. Уф

4b9b3361

Ответ 1

Вы можете сделать что-то вроде этого, если не нужен доступ к внешнему классу во внутреннем классе (который вы не имели бы в Java, если бы ваш внутренний класс был объявлен static):

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

Ответ 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 являются экземплярами -других классов. Один класс в порядке. Нажмите, а другой отменит. Нажмите. Если вы хотите сослаться на тип всех классов Click, вы можете сказать "Button # Click".

Ответ 3

Из scala -lang:

нет понятия "статические" члены в Scala. Вместо этого Scala лечит статические члены класса Y в качестве членов одноэлементного объекта Y

Итак, кажется, что у вас может быть класс, определенный внутри Object, но не статический класс, определенный внутри класса.

Ответ 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)

Ответ 5

В scala, если вам нужно создать некоторые статические методы, вы можете использовать объект-компаньон с тем же именем класса, где вы храните все псевдостатические методы. Пример:

class A {
}

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

Тогда вы можете просто использовать A.xpto.
Постарайтесь больше узнать о сопутствующих модулях на scala