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。

4

7 回答 7

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; }
}
于 2012-10-01T14:14:26.797 回答
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 score 方法。

于 2012-10-01T14:23:52.993 回答
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 反模式,但它会让你实现你可能想要实现的目标。

于 2012-10-01T14:45:34.283 回答
0

静态数据由类的所有实例共享。您的 1 级实例会共享它,您的 levelN 也会共享它:)。

于 2012-10-01T14:14:20.480 回答
0

这个答案有很多开销,但是您可以创建一个具有一个字段的分数类,int score并将所有级别对象指向分数对象,其中级别 = 1。这样,每次更改分数时,指向它的所有对象都会更改分数。

于 2012-10-01T14:17:04.317 回答
0

不,我不认为这是可能的。static只是跨应用程序共享的一份副本。你需要考虑重新设计你的代码。

于 2012-10-01T14:12:22.167 回答
0

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

方法:

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

}

我希望我有所帮助。

于 2012-10-01T14:21:59.917 回答