statiche - java chiamare metodo di un'altra classe



Classi interne statiche in scala (4)

Come altri hanno sottolineato, le classi "statiche" dovrebbero essere collocate all'interno dell'oggetto associato.

In Scala, classi, tratti e oggetti che sono membri di una classe dipendono dal percorso. Per esempio:

class Button {
  class Click
}


val ok = new Button
val cancel = new Button

val c1 = new ok.Click
val c2 = new cancel.Click

Ora c1 e c2 sono istanze di classi -differenti. Una classe è ok. Fai clic su, e l'altra è cancel.Click. Se vuoi fare riferimento al tipo di tutte le classi Click, puoi dire Button # Click.

https://code.i-harness.com

Qual è l'analogico in Scala per fare ciò in Java:

public class Outer {
  private Inner inner;

  public static class Inner {
  }

  public Inner getInner() { return inner; }
}

Voglio in particolare che la mia classe interna non debba avere un nome completo, cioè voglio Trade.Type , non TradeType . Quindi in Scala ho immaginato che potesse essere qualcosa del tipo:

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

Ma questo non sembra funzionare: la mia scala Inner non sembra essere visibile al di fuori della classe Outer . Una soluzione sarebbe ovviamente:

class Inner
class Outer(val inner: Inner)

Che va bene, ma a causa dei nomi delle mie classi, Inner è in realtà il "tipo" di Outer e Outer realtà ha un nome lungo. Così:

class SomeHorriblyLongNameType
class SomeHorriblyLongName(myType: SomeHorriblyLongNameType)

Che è prolisso e orribile. Potrei sostituire SomeHorriblyLongNameType con Type ma non ci sarebbe quindi alcuna connessione ovvia tra esso e la classe a cui era correlato. Uff


In scala se è necessario creare alcuni metodi statici è possibile utilizzare un oggetto associato, con lo stesso nome della classe, in cui vengono memorizzati tutti i metodi pseudo statici. Ex:

class A {
}

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

Quindi puoi semplicemente usare A.xpto .
Prova a leggere di più sui moduli companion su scala


Puoi fare qualcosa del genere se non hai bisogno di accedere alla classe esterna nella classe interna (che non avresti in Java dato che la tua classe interna è stata dichiarata static ):

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

Da scala-lang :

non esiste alcuna nozione di membri "statici" in Scala. Scala invece considera i membri statici della classe Y come membri dell'oggetto Singleton Y

Quindi sembra che tu possa avere una classe definita all'interno di un oggetto, ma non una classe statica definita all'interno di una classe.





inner-classes