Frage

Ich versuche, ein wirkliches Äquivalent für Java public static final in Scala zu erhalten für die Verwendung von Twip .

Erstellen eines val in einem object nicht für mich nicht funktioniert, weil es Teil einer neuen generierten Klasse Example$.class ist und TWIP kann es nicht von Klasse Example.class zugreifen zu können.

Hier ist ein Beispiel für eine Java-Klasse ich in dem Hafen Scala versucht:

public static final String[] MY_STRINGS = { "A", "B", "C" };

@Test
public void myTest(@Values("MY_STRINGS") String string) {
  ...
}

Aber ich weiß nicht, wie in dem Hafen den public static final zu Scala. Wenn es ein val in einem Objekt wie hier

@RunWith(classOf[TwiP])
class Foo {

  import Foo.MY_STRINGS

  @Test
  def testTwiP(@Values("MY_STRINGS") value: String): Unit = {
    println("I'm testing value " + value + ".")
  }

}

object Foo {
  val MY_STRINGS = Array("A", "B", "C")
}

erhalte ich nur die folgende Ausnahme:

net.sf.twip.internal.TwipConfigurationError:
there is no method or field 'MY_STRINGS' named in the @Values annotation of Parameter#1

Wie kann ich das Problem mit Scala lösen?

War es hilfreich?

Lösung

Der folgende Scala Code:

class Foo{
  import Bar.MY_STRINGS
}
object Bar{
  val MY_STRINGS=Array("A","B","C")
}

Erzeugt die folgenden Java-Klassen:

public final class Bar extends java.lang.Object{
    public static final java.lang.String[] MY_STRINGS();
    public static final int $tag()       throws java.rmi.RemoteException;
}
public final class Bar$ extends java.lang.Object implements scala.ScalaObject{
    public static final Bar$ MODULE$;
    public static {};
    public Bar$();
    public java.lang.String[] MY_STRINGS();
    public int $tag()       throws java.rmi.RemoteException;
}
public class Foo extends java.lang.Object implements scala.ScalaObject{
    public Foo();
    public int $tag()       throws java.rmi.RemoteException;
}

Der folgende Scala Code:

class Foo{
  import Foo.MY_STRINGS
}
object Foo{
  val MY_STRINGS=Array("A","B","C")
}

Erzeugt die folgenden Java-Klassen:

public class Foo extends java.lang.Object implements scala.ScalaObject{
    public Foo();
    public int $tag()       throws java.rmi.RemoteException;
}
public final class Foo$ extends java.lang.Object implements scala.ScalaObject{
    public static final Foo$ MODULE$;
    public static {};
    public Foo$();
    public java.lang.String[] MY_STRINGS();
    public int $tag()       throws java.rmi.RemoteException;
}

Die Tatsache, dass statische Elemente sind nicht auf die Klasse definiert, wenn das Objekt den gleichen Namen hat wie die Klasse Scala Bug # 1735 und es in Scala 2.8 Snapshots fixiert wird.

So wie es aussieht Twip nicht geht, überhaupt arbeiten, es sei denn Du entweder Scala aktualisieren, oder einen Weg finden, um Twip mit nicht-statischer Parameter Generation Methoden zu arbeiten.

Andere Tipps

object Foo{
  val MY_STRINGS=Array("A","B","C")
}
class Foo{
  import Foo.MY_STRINGS
}

Die val Definition im Begleitobjekt erstellt Ihre public static final Variable und die import Erklärung gibt es eine schöne und einfach alias im Code verwenden Sie die Klasse zu schreiben.

Beachten Sie, dass die public static final Variable in Scala wird nach wie vor wie eine statische Methode aufrufen suchen kompilieren, wenn Sie diesen Code aus Java aufrufen.

Edit:. ich wegen eines Fehlers in Scala etwas falsch bin 2.7, die ich im Detail in einer anderen Antwort zeigen

Sie müssen nur die Variable als "val" in einem Begleitobjekt definieren.

object Foo{
  val MyStrings = Array("A","B","C")
}

Hinweis: endgültige statische Variablen in scala nicht der gleiche Konvention wie in Java folgen. Schauen Sie sich auf: http://docs.scala-lang.org/style/naming-conventions. html

Wenn Sie eine var verwenden, dann können Sie Ihre eigenen Getter und Setter erstellen, und wenn der Wert bereits eingestellt ist, kann es nicht ändern.

Das mag nicht der beste Ansatz sein, aber es wäre hilfreich, wenn Sie erklären könnte, warum Sie public static final auf eine Variable verwenden möchten, wie eine bessere Lösung deutlicher sein könnte dann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top