classes internas estáticos em scala
-
21-08-2019 - |
Pergunta
O que é o análogo no Scala de fazer isso em Java:
public class Outer {
private Inner inner;
public static class Inner {
}
public Inner getInner() { return inner; }
}
Eu quero especificamente minha classe interna para não tem que ter um nome totalmente qualificado - ou seja, eu quero Trade.Type
, não TradeType
. Assim, em Scala eu imaginava que poderia ser algo como:
class Outer(val inner: Inner) {
object Inner
}
Mas isso não parece trabalho: meu scala Inner
apenas parece não ser visível do exterior da classe Outer
. Uma solução seria, evidentemente:
class Inner
class Outer(val inner: Inner)
O que é OK - mas por causa dos nomes de minhas aulas, Inner
é realmente o "tipo" do Outer
e Outer
realmente tem um nome longo. Assim:
class SomeHorriblyLongNameType
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType)
O que é detalhado e horrível. Eu poderia substituir SomeHorriblyLongNameType
com apenas Type
mas haveria então nenhuma conexão óbvia entre ele e a classe que foi relacionado. Ufa
Solução
Você pode fazer algo assim se não precisa de acesso à classe externa na classe interna (que você não teria em Java dada static
que a sua classe interna foi declarado):
object A{
class B {
val x = 3
}
}
class A {
// implementation of class here
}
println(new A.B().x)
Outras dicas
Como outros apontaram, aulas de "estático" deve ser colocado dentro do objeto companheiro.
Em Scala, classes, traços e objetos que são membros de uma classe são dependentes do caminho. Por exemplo:
class Button {
class Click
}
val ok = new Button
val cancel = new Button
val c1 = new ok.Click
val c2 = new cancel.Click
Agora c1 e c2 são instâncias de classes -different-. Uma classe é ok.Click, eo outro é cancel.Click. Se você queria para se referir ao tipo de todas as classes clique, você poderia dizer o botão # Click.
não há nenhuma noção de membros 'estáticos' em Scala. Em vez disso, Scala guloseimas membros estáticos de classe Y como membros do objecto Singleton Y
Assim, parece que você poderia ter uma classe definida dentro de um objeto, mas não uma classe estática definida dentro de uma classe.
Não tenho certeza eu entendi completamente o seu caso de uso ... Se ele pode ajudá-lo, objetos classes dentro são visíveis como os campos de uma instância, e.
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)
Além disso, você pode perfeitamente substituir val de um pai com objeto:
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)
Em scala se você precisa criar um alguns métodos estáticos que você pode usar um objeto companheiro, com o mesmo nome da classe, onde você armazena todos os métodos pseudo estáticos. Ex:
class A {
}
object A {
def xpto // define some pseudo static methods here..
}
Em seguida, você pode apenas usar A.xpto
.
Tente ler mais sobre módulos companheiro em scala