2013-03-11 115 views
6

我有很多抽象類的子類,並且它們中的每個都聲明具有相同名稱的公共靜態最終字段。我正在考慮在抽象超類中擁有這個字段而沒有初始化它,並希望每個子類都被迫初始化它。抽象類或接口中的公共靜態最終字段

我在想這個,因爲抽象類的所有子類都聲明瞭一個名爲UNIQUE_ID的公共靜態最終字符串字段,並且每個子類都必須用這個名稱聲明這樣的字段。

我希望我的問題很清楚,如果不是,請告訴我。

能做些什麼或多或少的相當於此?

編輯:程式碼:

我的抽象類是這樣的:

public abstract class ExperimentPanelModel extends Panelizable { 
protected String nextButtonText; 
protected String backButtonText; 
protected String skipButtonText; 
protected Properties currentFile; 
protected List<Properties> pastFiles = new ArrayList<Properties>(); 

public ExperimentPanelModel(Properties argcurrentfile, List<Properties> argpastfiles) { 
    currentFile = argcurrentfile; 
    pastFiles = argpastfiles; 
    nextButtonText = "Next"; 
    backButtonText = "Back"; 
    skipButtonText = "Skip"; 
} 
... 
} 

一些抽象類樣子的非抽象子類(請注意,所有這些聲明public static final String UNIQUE_ID) :

public class ConfigurationGUI extends ExperimentPanelModel { 

public static final String UNIQUE_ID = "ConfigurationGUI"; 
public static final String DATA_MODIFIED = "DataModified"; 

Date dateOfLastSession; 
int ExperimentalSession; 
int ExperimentOrder; 

boolean nextButtonEnabled = false; 

public ConfigurationGUI(Properties argcurrentfile, List<Properties> argpastfiles) { 
    super(argcurrentfile, argpastfiles); 
    nextButtonText = "Confirm"; 
    backButtonText = "Abort"; 
} 

... 
} 

一個例子更多:

public class Introduction extends ExperimentPanelModel { 

public static final String UNIQUE_ID = "Introduction"; 
public static final String INSTRUCTIONS_XML_FILE = "instructions.xml"; 
public static final String THIS_INSTRUCTION_PROPERTY = UNIQUE_ID; 

private String thisInstructionText = UNIQUE_ID; 

Properties readInstructionsProperties = new Properties(); 

public Introduction(Properties argcurrentfile, List<Properties> argpastfiles) { 
... 

,最後一個:

public class Instruction1 extends ExperimentPanelModel { 

public static final String UNIQUE_ID = "Instruction1"; 
public static final String INSTRUCTIONS_XML_FILE = "instructions.xml"; 
public static final String THIS_INSTRUCTION_PROPERTY = UNIQUE_ID; 
... 
} 
+1

請添加片段代碼,使這個問題更清晰! – ppeterka 2013-03-11 16:51:13

+1

發佈一些代碼請 – 2013-03-11 16:51:27

+1

希望我的回答是有幫助的。不確定是否有比當前實施更好的快速修復。從長遠來看,從靜態字段轉移到跟蹤元數據的單獨數據結構可能是一種改進。 – 2013-03-15 14:37:37

回答

8

領域的想法是行不通的,因爲靜態字段不能在子類中重寫。你可以做的是你可以在抽象類上聲明一個抽象方法,以便你的子類必須實現它。

另請注意,您不能將其設爲靜態方法,因爲這些方法也不會被覆蓋。

1

將公共最終字段UNIQUE-ID放入抽象類並聲明一個受保護的構造函數,該構造函數接受UNIQUE-ID的值。您將無法將其設置爲靜態,因爲對於不同的實例,值需要不同。

+0

上面的答案好多了:-) – GHC 2013-03-11 17:00:23

3

在你的情況下,我會在祖先中定義變量。在每個擴展類中都沒有變量,除非你有一個特別好的理由,而你聽起來並不像這樣。

對於Nathan的回覆+1。在很多情況下,這是一件更好的事情。

+0

謝謝,我讀到這個問題意味着該字段必須在每個子類中採用不同的值。這個問題並不十分清楚。 – 2013-03-11 17:54:44

+0

是的,問題是沒有很好的公式化。 – carlspring 2013-03-11 19:42:53

+0

彌敦道休斯閱讀正確。我剛剛添加了一些代碼,我希望現在更清楚。 – deinocheirus 2013-03-12 10:30:01

相關問題