2009-10-27 14 views
8

Sto cercando di ottenere un equivalente reale per Java public static final in Scala per l'utilizzo di TwiP.Scala: finale statico pubblico in una classe

Creazione di un val in un object non funziona per me, perché è parte di una nuova classe generata Example$.class e TWIP non può accedervi dalla classe Example.class.

Ecco un esempio di una classe Java che sto cercando di porto a Scala:

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

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

Ma io non so come alla porta il public static final alla Scala. Se si tratta di un val in un oggetto come qui

@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") 
} 

Ho solo ottenere la seguente eccezione:

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

Come posso risolvere il problema applicando Scala?

+0

TwiP = http://twip.sourceforge.net/? –

+0

In tal caso, forse http://code.google.com/p/scalacheck/ è più appropriato? –

+0

Sì, è questo twip. Controllerò il bilanciamento. Grazie per il link. – renfis

risposta

1

Se si utilizza una var, è possibile creare il proprio getter e setter e, se il valore è già impostato, non modificarlo.

Questo potrebbe non essere l'approccio migliore, ma sarebbe utile se si potesse spiegare perché si desidera utilizzare public static final su una variabile, in quanto una soluzione migliore potrebbe essere più ovvia.

+0

Ciao James, grazie per il tuo commento. Sto cercando di eseguire quanto segue in Scala: stringa statica finale pubblica [] MY_STRINGS = {"A", "B", "C"}; @Test pubblico myTest void (@Values ​​("MY_STRINGS") stringa String) { ...} http://twip.sourceforge.net/howto.html Ma io non so come portare il pubblico finale statico a Scala. Se si tratta di una val in un oggetto ottengo solo quanto segue: net.sf.twip.internal.TwipConfigurationError: non esiste alcun metodo o campo 'myStrings' denominato nell'annotazione @Values ​​del parametro # 1 – renfis

+0

@renfis - È possibile vuoi mettere questa informazione nella tua domanda, formattata correttamente, per renderla più facile da leggere. –

+0

Grazie. L'ho fatto. – renfis

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

La definizione val nell'oggetto compagna crea la variabile public static final, e la dichiarazione import dà un bel facile alias nel codice che si sta utilizzando a scrivere la classe.

Si noti che la variabile public static final in Scala verrà compilata per apparire come una chiamata di metodo statico se si chiama questo codice da Java.

Modifica: Sono leggermente in errore a causa di un bug in Scala 2.7, che mostro in dettaglio in un'altra risposta.

+0

Grazie per il tipp. L'ho provato e l'ho aggiunto alla mia domanda. Ma non funziona per me. :( – renfis

+0

Questo perché scala non espone una variabile come variabile - la espone come metodo.È necessario trovare una versione dell'annotazione @values ​​che chiama un metodo e utilizza i valori restituiti dal metodo –

+0

Vuoi dire, la versione attuale di TwiP non funzionerà con Scala? È un peccato – renfis

3

Il seguente codice Scala:

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

genera i seguenti classi Java:

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; 
} 

il seguente codice Scala:

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

genera i seguenti classi Java:

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; 
} 

Il fatto che i membri statici non siano definiti sulla classe quando l'oggetto ha lo stesso nome della classe è Scala Bug #1735 ed è corretto nelle istantanee di Scala 2.8.

Quindi sembra che TwiP non funzionerà affatto a meno che non si aggiorni Scala, o si trovi un modo per far funzionare TwiP con metodi di generazione dei parametri non statici.

2

Devi solo definire la variabile come "val" in un oggetto associato.

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

NOTA: le variabili statiche finali in scala non seguono la stessa convenzione di Java. Date un'occhiata a: http://docs.scala-lang.org/style/naming-conventions.html

Problemi correlati