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

アクセサー メソッド (ゲッター/セッター) を使用するように変更し、次のようにします。

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()レベルが最終的なものであるように感じるので、メソッドを省略しました。levelである場合final、スコアの取得/設定メソッドをオーバーライドする別のクラスとしてこれを実装できます (実装する必要があります)。

于 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);

このソリューションは恐ろしいシングルトンのアンチパターンを使用していますが、おそらく達成したいことを実現できます。

于 2012-10-01T14:45:34.283 に答える
0

いいえ、それは不可能だと思います。staticアプリケーション間で共有される唯一のコピーです。コードの再設計について考える必要があります。

于 2012-10-01T14:12:22.167 に答える
0

STATIC DATA は、クラスのすべてのインスタンスによって共有されます。レベル 1 インスタンスはそれを共有するので、レベル N :) も共有します。

于 2012-10-01T14:14:20.480 に答える
0

あなたが考えているようにそれを行うことは不可能です。しかし、スコアを適切な入力値に返す単一の静的メソッドを持つクラスを作成することは可能です。

メソッド:

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

}

お役に立てば幸いです。

于 2012-10-01T14:21:59.917 に答える
0

この回答には多くのオーバーヘッドが伴いますが、1 つのフィールドを持ち、スコアint scoreオブジェクトでレベル = 1 のすべてのレベル オブジェクトを指すスコア クラスを作成できます。そうすれば、スコアが変更されるたびに、それを指すすべてのオブジェクトが変更されます。

于 2012-10-01T14:17:04.317 に答える