2011-03-12 91 views
1

我想從另一個類訪問公共整數用於下面的switch語句:表達式中的非靜態變量?

StateManager sm = new StateManager(0); 

switch (localState) { 
    case (sm.ALL_COMPANIES_REQUEST): { 
     //do something 
    } 
    case (sm.GENERAL_TICKER_REQUEST): { 
     //do this instead  
    } 

然而,這些變量需要被多個線程訪問,所以我不想讓他們靜態的。不幸的是,我得到一個錯誤,說案例表達式必須是不變的。沒有方法可以改變這些變量,它們是不變的,但似乎沒有標記它們,計算機無法弄清楚。任何人都知道如何解決這個問題?

編輯: 如何嵌套類,這是一個選項,因爲StateManager實際上只對具有上述switch語句的類有用。這是否足以單獨使用最終?

回答

4

要求是switch語句中的值是常量表達式或枚舉值;見JLS 14.11

JLS 15.28中描述了一個常量表達式。本質上它是一個編譯時間的常量表達式。所以這意味着像這樣的東西不會編譯:

static final int foo = someString.length(); 
    ... 
    switch (x) { 
     case foo: ... // case label is not a >>compile time<< constant 
    } 

但是,你對靜態常量和線程的關注是沒有根據的。 final字段的說明明確指出,可以在不同步的情況下安全讀取它們;見JLS 17.5

(再說了,你不會得到死鎖即使領域沒有最終的決定。你會得到什麼是線程可能看到現場的過時的值,如果他們沒有父對象上正確地同步或。類)

所以回答你的問題是:

  • 如果常量是編譯時間常數,你可以聲明是爲static final和switch語句將編譯,但
  • 如果常量不是編譯ti我不斷,然後宣佈它爲static final不會幫助。

如何嵌套類?

這不會有什麼區別。

2

如果它們是常量,則在聲明它們並在case語句中使用它們時不存在任何問題final static。多線程在這裏沒有影響。

+0

哦好吧,我認爲這可能會導致線程鎖定。謝謝您的幫助! – providence 2011-03-12 05:47:09

+0

這是錯誤的?答案或我的假設? – providence 2011-03-12 06:12:01

+0

你的假設,你會有問題,使用來自多個線程的靜態final是不正確的。 – 2011-03-12 06:41:42

1

爲什麼不在聲明中聲明這些字段?

enum Request { 

    ALL_COMPANIES, 
    GENERAL_TICKER 

} 

然後在您的交換機中使用它。

1

嘗試使用final,這將使其不變。

+0

他們是最後的,不幸的是這還不夠。也許是因爲他們被定義在另一個班級?我不確定.. – providence 2011-03-12 06:11:43

0

在顯示切換之前在線上使用static/static + final修飾符。

void m(){ 
final int a = 0; 

switch(e) 
case a : ... 

} 

woudl不工作,因爲void m()會在靜態attrs/methods編譯完成後編譯。

void m() 
{ 
switch(e) 
case a : ... 
} 

final int a = 0; 

woudl不行,因爲declaraton 「a」 是開關

final int a = 0; 

void m() 
{ 
switch(e) 
case a : ... 
} 

後會工作 。

同樣的原則

static A a = new A(b); 
static B b = new B(); 

因爲JVM生成器逐行讀取代碼行是行不通的......它不是更糟,因爲在C/C++,但它仍然存在。

開關適用於靜,最終常量,枚舉...他們不工作的HashSet的條目(這是一件事,讓我很生氣:d)

+0

開關不是他們在堆中有特殊子樹的條件,所以你必須考慮這一點,並想象當你構建你的代碼時,即使它看起來像「開關在你的代碼在這個或那個行之前或者在一些屬性聲明之後「在物理上他們沒有看到對方,這就是爲什麼它不起作用。 – 2013-04-20 14:24:26

+0

因此,如果您確定「這些將是您的常量」,請嘗試使用枚舉,或嘗試使用靜態常量的Provider類來處理您希望切換/打開的每個條目。 – 2013-04-20 14:25:38