2009-10-27 15 views
8

Estoy tratando de obtener un equivalente real para public static final de Java en Scala para usar TwiP.Scala: final estático público en una clase

Creación de una val en un object no funciona para mí, porque es parte de una nueva clase generada Example$.class y TwiP no puede acceder a él desde la clase Example.class.

He aquí un ejemplo de una clase Java que estoy tratando de puerto a Scala:

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

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

Pero no sé cómo portar el public static final a Scala. Si se trata de un val en un objeto como aquí

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

solo me dan la siguiente excepción:

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

¿Cómo puedo resolver el problema con Scala?

+0

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

+0

En caso afirmativo, ¿es posible que http://code.google.com/p/scalacheck/ sea más apropiado? –

+0

Sí, es este twip. Comprobaré scalacheck. Gracias por el enlace. – renfis

Respuesta

1

Si usa una var, puede crear su propio captador y colocador, y si el valor ya está establecido, no lo cambie.

Puede que ese no sea el mejor enfoque, pero sería útil si pudiera explicar por qué quiere usar public static final en una variable, ya que una mejor solución podría ser más obvia.

+0

Hola James, gracias por tu comentario. Estoy tratando de hacer lo siguiente en Scala: public static final Cadena [] MY_STRINGS = {"A", "B", "C"}; @test pública myTest vacío (@Values ​​("MY_STRINGS") String cadena) {} ... http://twip.sourceforge.net/howto.html Pero no sé cómo para portar el final estático público a Scala. Si es un valor en un objeto, solo obtengo lo siguiente: net.sf.twip.internal.TwipConfigurationError: no hay ningún método ni campo 'myStrings' nombrado en la anotación @Values ​​del Parámetro # 1 – renfis

+0

@renfis - Puede desea poner esta información en su pregunta, formateada adecuadamente, para que sea más fácil de leer. –

+0

Gracias. Lo hice. – renfis

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

La definición val en el objeto acompañante crea la variable de public static final, y la declaración import le da un alias fácil agradable en el código que está utilizando para escribir la clase.

Tenga en cuenta que la variable public static final en Scala se compilará para que parezca una llamada a método estático si llama a este código desde Java.

Edición: Estoy un poco equivocado debido a un error en Scala 2.7, que demuestro en detalle en otra respuesta.

+0

Gracias por la tipp. Lo probé y lo agregué a mi pregunta. Pero no funciona para mí. :( – renfis

+0

Esto se debe a que scala no expone una variable como una variable: lo expone como un método. Necesita encontrar una versión de la anotación @values ​​que llame a un método y use los valores devueltos por el método. –

+0

¿Quieres decir que la versión actual de TwiP no funcionará con Scala? Es una pena. – renfis

3

El siguiente código Scala:

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

genera las siguientes clases de 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; 
} 

el siguiente código Scala:

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

genera las siguientes clases de 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; 
} 

El hecho de que los miembros estáticos no estén definidos en la clase cuando el objeto tiene el mismo nombre que la clase es Scala Bug #1735 y está solucionado en las instantáneas de Scala 2.8.

Parece que TwiP no funcionará en absoluto a menos que actualice Scala o encuentre la manera de hacer que TwiP funcione con métodos de generación de parámetros no estáticos.

2

Simplemente tiene que definir la variable como "val" en un objeto complementario.

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

NOTA: las variables estáticas finales en scala no siguen la misma convención que en Java. Eche un vistazo a: http://docs.scala-lang.org/style/naming-conventions.html

Cuestiones relacionadas