2012-10-01 52 views
2

我有一個類如下:有條件的靜態字段可能嗎?

public class Level{ 
public int level; 
public int score; 
} 

基本上,我想表現的評分爲靜態的水平的特定值。例如,在比賽中,一個團隊有多個競爭者,每個參與者都有助於某個特定等級的得分。我希望在每個級別相同的情況下,將他們的每個貢獻加入分數中。 我想知道是否可以這樣做。

編輯

我覺得這個問題會更容易想象,如果我改變我的等級有點像這樣:

public class Participants{ 
public String name; 
public String teamID; 
public int[] levelScores; //where the level is denoted 
          //by the index of this array 
} 

現在,對於所有參與者使用相同的teamID的levelScores必須共享,並且必須將具有相同teamID的任何參與者對象的貢獻添加到相應的levelScore。

+0

不確定你想要在這裏實現什麼。引用'Level'的類是否從已知的地方獲取或者自己創建它? –

+0

'水平'是不可變的嗎? –

回答

0

不,我不認爲這是可能的。 static只是在應用程序中共享的一個副本。你需要考慮重新設計你的代碼。

0

靜態數據由類的所有實例共享。你的1級實例會分享它,你的levelN :)也是如此。

3

這涉及到更改代碼,不太可能是值得額外的複雜性恕我直言。我只想用你的代碼(和使字段最終如果你能)

abstract Level { 
    public int getLevel(); 
    public int getScore(); 
} 

class LevelOne extends Level { 
    public int getLevel() { return 1; } 
    public int getScore() { return LEVEL_ONE_SCORE; } 
} 

class LevelTwo extends Level { 
    private final int score; 
    public int getLevel() { return 2; } 
    public int getScore() { return score; } 
} 

class LevelN extends Level { 
    private final int level; 
    private final int score; 
    public int getLevel() { return level; } 
    public int getScore() { return score; } 
} 
+0

我想你只是想'Level'(現在是'LevelN')和'LevelOne' – Bohemian

+0

LevelN有一個分數的字段。 AFAIK如果它有這個字段,那麼有一個LevelOne也沒有意義。 –

+0

我會發佈一個答案... – Bohemian

0

有很多與這個答案相關的開銷,但你可以創建一個有一個字段int score和點得分類得分對象的level = 1的所有關卡對象。這樣每次分數改變時,對於指向它的所有對象它都會改變。

0

這是不可能的,你這樣想。 但是可以用一個靜態方法創建一個類,並將得分返回給適當的輸入值。

的方法:

public static int(int level) { 
     if(level==1) { 
      return //what you want. 
     } 

} 

我希望我幫助。

3

更改使用訪問方法(getter/setter方法),並做到這一點:

class Level { 
    private static int levelOneScore; 
    private int level; 
    private int score; 

    public int getLevel (
     return level; 
    ); 

    public int getScore() { 
     return level == 1 ? levelOneScore : score; 
    } 

    public void setScore(int score) { 
     if (level == 1) { 
      levelOneScore = score; 
     } else { 
      this.score = score; 
     } 
    } 
} 

,因爲它感覺像水平應該是最終我省略了setLevel()方法。如果levelfinal,那麼您可以(也應該)將其作爲覆蓋get/set分數方法的單獨類來實現。

+0

+1我確實想到這個,它不是OOP,而是我更可能做的。 –

1

剛看了一下你的個人資料......你自己在學習,所以我假設你不會使用任何類似於JNDI,Spring或任何其他類型的容器或框架。

這樣做,而不訴諸一個完全靜態的類層次結構的最簡單的方法是使用level作爲重點參考比分:

public class Level { 
    private static Level instance = null; 
    private static Map<Integer, Integer> scoreMap = new HashMap<Integer, Integer>(); 

    public static Level getInstance() { 
     if (instance == null) { 
     instance = new Level(); 
     } 
     return instance; 
    } 

    public static int getScore(int level) { 
     return scoreMap.get(level); 
    } 

    public static void setScore(int level, int score) { 
     scoreMap.put(level, score); 
    } 
} 

使用Level會做這樣的任何類:

int myLevel = 1; // I assume the class will know its level somehow 

Level scoreKeeper = Level.getInstance(); 

int myScore = scoreKeeper.getScore(myLevel); 

該解決方案使用可怕的Singleton反模式,但它會讓你用你可能想要達到的目標。