2010-11-02 7 views
16

Utilizo el tapiz 5 como mi opción de marco web. Tapiz me permite definir símbolos en la clase de configuración e inyectar símbolos en otros componentes.Práctica recomendada para las constantes de uso en las anotaciones scala

por ejemplo,

 
public interface SymbolConstants { 
    static String DEFAULT_TIMEOUT_KEY = "default.timeout"; 
} 

public class AppModule { 
    void contributeApplicationDefault(Configuration conf) { 
     conf.add(SymbolConstants.DEFAULT_TIMEOUT_KEY, "10"); 
    } 
} 

public class MyComponent { 
    @Symbol(SymbolConstants.DEFAULT_VALUE_KEY) 
    private long timeout; 
} 

La capacidad de definir constantes estáticas y utilizarlos como valores de anotación me da compilar control horario.

Me pregunto cómo definir constantes y usarlas como valores de anotaciones scala. De lo contrario, ¿cuál es la mejor práctica para definir/limitar el valor que podemos asignar a las anotaciones en Scala?

Respuesta

1

No parece posible w versiones/Scala 2.8.1.final, 2.8.2.final, o 2.9.1.final (el resultado fue el mismo con todos):

object Constant { val UNCHECKED = "unchecked" } 

class Test {          
    @SuppressWarnings(Array(Constant.UNCHECKED)) 
    def test: Unit = println("testing.. 1, 2... 3") 
} 

.

<console>:7: error: annotation argument needs to be a constant; found: Constant.UNCHECKED 
      @SuppressWarnings(Array(Constant.UNCHECKED)) 
+0

No funciona porque SuppressWarnings quiere una matriz. Si usa otras anotaciones funciona. Pruebe con @SerialVersionUID. http://www.scala-lang.org/node/106 – onof

20

La palabra clave 'final' es necesaria para hacer que el compilador la emita como lo haría en Java. Por ejemplo,

object Foo 
{ 
    final val MY_SYMBOLIC_CONSTANT="whatever" 
} 

Parece que, de lo contrario, solo obtendrá un método de acceso debajo del cofre que no se puede calcular de manera estática.

+1

No funciona (usando Scala 2.10) – sortega

+0

¡Funciona para mí en Scala 2.10.3! –

+0

No funciona en Scala 2.10.4 :-( –

Cuestiones relacionadas