我工作的程序/游戏,我有使用参数的静态实用工具类。
class ParamsGeneral {
public static final int H_FACTOR = 100;
public static int MAX_SCORE = 1000;
...
}
然后我需要在某些特定情况下,以覆盖此值,例如打在地图上有限的成绩。 所以我做了以下内容:
class ParamsLimited extends ParamsGeneral {
public static int MAX_SCORE = 500;
// other params stay same
}
和预期的用法如下:
class Player {
ParamsGeneral par;
public Player() {
if(onLimitedMap()){
par = new ParamLimited();
}
}
public boolean isWinner() {
if(this.score == par.MAX_SCORE) {
return true;
}
return false;
}
}
我还没有实际测试此代码,因为IDE抱怨通过实例,也对现场的藏身调用静态字段。 我清楚地看到,这个代码是太臭了,那么有没有办法实现这个还是我必须要分开来写每个PARAM类?
PS:我知道我768,16使默认抽象类和使用干将,我只是好奇,如果有一种方法可以使静态值入店。
你不能覆盖静态成员 - 在Java中,没有方法也不领域可以替代。 然而,在这种情况下,它看起来并不像你需要做任何的是:因为你有一个实例ParamsGeneral
在par
变量,非静态方法会做你需要经常超越什么。
class ParamsGeneral {
public int getMaxScore() {
return 1000;
}
}
class ParamsLimited extends ParamsGeneral {
@Override public int getMaxScore() {
return 500;
}
}
...
public boolean isWinner() {
// You do not need an "if" statement, because
// the == operator already gives you a boolean:
return this.score == par.getMaxScore();
}
我不会用子类为一般游戏VS有限的游戏。 我会用枚举,如:
public enum Scores {
GENERAL (1000),
LIMITED (500),
UNLIMITED (Integer.MAX_INT);
private int score;
private Scores(int score) { this.score = score; }
public int getScore() { return score; }
}
然后,构建一个游戏的时候,你可以这样做:
Params generalParams = new Params(Scores.GENERAL);
Params limitedParams = new Params(Scores.LIMITED);
等等。
这样做,这样可以让你改变你的游戏的性质,同时保持你的价值观集中。 试想一下,如果每一个类型的参数,你认为你必须创建一个新的类。 它可以得到非常复杂的,你可以有几百个类!
最简单的办法是做这样的:
class ParamsGeneral {
public static final int H_FACTOR = 100;
public static final int MAX_SCORE = 1000;
public static final int MAX_SCORE_LIMITED = 500;
...
}
class Player {
int maxScore;
public Player() {
if(onLimitedMap()){
maxScore = ParamsGeneral.MAX_SCORE_LIMITED;
}
else {
maxScore = ParamsGeneral.MAX_SCORE;
}
}
public boolean isWinner() {
if(this.score == this.maxScore) {
return true;
}
return false;
}
}
没有必要有ParamsGeneral的实例,它仅仅是一个为你的游戏静态定义集合。
有MAX_SCORE
与公共静态干将私人静态的; 然后你可以打电话ParamsGeneral.getMaxScore
和ParamsLimited.getMaxScore
分别,你会得到1000和500