条件静态字段可能吗?

时间:2012-10-01 14:10:49

标签: java static

我有一个课程如下:

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。

7 个答案:

答案 0 :(得分: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; }
}

答案 1 :(得分: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得分方法的单独类。

答案 2 :(得分: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反模式,但是它可以帮助你实现你想要实现的目标。

答案 3 :(得分:0)

不,我认为不可能。 static只是在应用程序之间共享的一个副本。您需要考虑重新设计代码。

答案 4 :(得分:0)

STATIC DATA由该类的所有实例共享。你的1级实例会分享它,你的levelN :)也是如此。

答案 5 :(得分:0)

此答案会产生大量开销,但您可以创建一个具有一个字段int score的分数类,并在分数对象中指向level = 1的所有级别对象。这样,每次更改分数时,都会针对指向它的所有对象进行更改。

答案 6 :(得分:0)

不可能按照你的想法去做。 但是可以使用单个静态方法创建一个类,该方法将得分返回到适当的输入值。

方法:

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

}

我希望我能帮忙。