有沒有人知道在調用超類構造函數之前,Java中是否有辦法在子類中設置實例變量的值。我有一個簡要的示意圖,下面是我要完成的工作 - 我需要根據子類的類型設置不同的超類定義的實例變量,但我仍然希望能夠共享通用的非構造函數代碼子類的不同實例。Java將子類實例數據傳遞給超類構造函數
有沒有乾淨的方式做到這一點,也許某種編碼,我很想念模式之類的東西?提前感謝任何想法。
public abstract class ConstraintSatisfactionProblem {
final Set<Variable> variables;
final Set<Constraint> constraints;
public Foo() {
this.variables = setupVariables();
this.constraints = setupConstraints();
}
public abstract Set<Variable> setupVariables();
public abstract Set<Constraint> setupConstraints();
public Map<Variable, Constraint> solve() { ... }
}
public class WordSquare extends ConstraintSatisfactionProblem {
final int size;
final static Set<Character> domain = ...;
public WordSquare() {
super(); // can I simulate calling super() after setting this.value = 4?
this.value = 4;
}
public Set<Variable> setupVariables() {
this.variables = new HashSet<Variable>();
for(int row = 0; row < size; ++row) {
for(int col = 0; col < size; ++col) {
variables.add(new Variable<Pair, Character>(new Pair(row, col), domain);
}
}
return this.variables;
}
public Set<Constraint> setupConstraints() {
// setup code specific to this problem
}
}
public class Cryptarithmetic extends ConstraintSatisfactionProblem {
final String problem;
public Cryptarithmetic(String problem) {
super();
this.problem = problem;
}
public Set<Variable> setupVariables() {
this.variables = new HashSet<Variable>();
for(char c : problem.toCharArray()) {
variables.add(new Variable<Character, Integer>(c, getDomain());
}
}
return this.variables;
}
public Set<Constraint> setupConstraints() {
// setup code specific to this problem
}
}
是編碼模式被稱爲'不要做it` - 您違反了最基本的安全保障爲OOP這裏的一個:不要叫從構造一個非最終方法。是的,有些極其罕見的情況下,有些人告訴我說這是有道理的(喬恩在野田時間iirc中這樣做),但我沒有遇到過檢查對象層次結構並不是正確的做法。一種情況。 – Voo 2011-12-13 17:35:50
也許探索抽象工廠或生成器來構造有效狀態的對象,而不是讓基礎在構造函數中調用虛擬方法。我相信這些模式中已經存在一些問題。 – 2011-12-13 17:39:15
如果我將`WordSquare.setupVariables`(和類似方法)的簽名更改爲`public final Set setupVariables()`,那麼它會好嗎? –
jay
2011-12-13 18:11:57