Статические внутренние классы в 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
, но тогда не было бы очевидной связи между ним и классом, к которому он был связан. Уф
Ответы
Ответ 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