2010-11-02 14 views
16

Używam gobelinu 5 jako mojego wyboru struktury sieci. Tapestry pozwala mi definiować symbole w klasie configure i wprowadzać symbole do innych komponentów.Najlepsza praktyka stosowania stałych w adnotacjach scala

np

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

Możliwość definiowania stałych statycznych i wykorzystywać je jako wartości adnotacji daje mi skompilować sprawdzić czas.

Zastanawiam się, jak zdefiniować stałe i używać ich jako wartości adnotacji scala. Jeśli nie, jaka jest najlepsza praktyka definiowania/ograniczania wartości, którą możemy przypisać do adnotacji w scala.

Odpowiedz

1

To nie wydaje się możliwe w/wersji Scala 2.8.1.final, 2.8.2.final lub 2.9.1.final (wynik był taki sam z wszystkie):

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

To nie działa, ponieważ SuppressWarnings chce tablicy. Jeśli używasz innych adnotacji. to działa. Spróbuj z @SerialVersionUID. http://www.scala-lang.org/node/106 – onof

20

Słowo kluczowe "końcowe" jest wymagane, aby kompilator emitował go tak, jak robiłbyś to w Javie. Np

object Foo 
{ 
    final val MY_SYMBOLIC_CONSTANT="whatever" 
} 

Wydaje się, że w przeciwnym razie, można dostać tylko metody dostępowej pod maską, która nie jest statycznie obliczalne.

+1

Nie działa (przy użyciu Scala 2.10) – sortega

+0

Działa dla mnie w Scali 2.10.3! –

+0

Nie działa w Scali 2.10.4 :-( –

Powiązane problemy