2013-03-11 3 views
6

У меня есть много подклассов абстрактного класса, и каждый из них объявляет публичное статическое конечное поле с тем же именем. Я думал о том, что это поле в абстрактном суперклассе не инициализируется и надеется, что каждый подкласс будет вынужден инициализировать его.public static final field в абстрактном классе или интерфейсе

Я думал об этом, потому что все мои подклассы абстрактного класса объявляют публичное статическое конечное поле String под названием UNIQUE_ID, и для каждого подкласса необходимо указать такое поле с таким именем.

Надеюсь, мой вопрос достаточно ясен, если не скажите, пожалуйста.

Может ли быть что-то более или менее эквивалентное этому?

EDIT: Код добавлен:

Мой абстрактный класс выглядит следующим образом:

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

+1

post какой-либо код пожалуйста –

+1

надежда мой ответ был полезный. не уверен, что есть быстрое исправление, которое лучше, чем текущая реализация. в конечном счете, отходит от статических полей к отдельной структуре данных, которая может отслеживать метаданные. –

ответ

8

Идея поле не будет работать, так как статические поля не могут быть переопределены в подклассах. Что вы можете сделать, так это то, что вы можете объявить абстрактный метод для абстрактного класса, чтобы ваши подклассы его реализовали.

Также обратите внимание, что вы не можете сделать его статическим методом, потому что они также не могут быть переопределены.

1

Поместите открытое конечное поле UNIQUE-ID в абстрактный класс и объявите защищенный конструктор, который принимает значение для UNIQUE-ID. Вы не сможете сделать его статичным, так как для разных экземпляров значения должны быть разными.

+0

Ответ выше намного лучше :-) – GHC

3

В вашем случае я бы определил переменную в предке. Нет смысла иметь переменную в каждом из расширяющихся классов, если у вас нет особо веской причины, которой вы не похожи.

+1 для ответа Натана. В довольно многих случаях это лучше.

+0

спасибо, я прочитал вопрос, чтобы поле должно было иметь другое значение в каждом подклассе. однако вопрос не очень ясен. –

+0

Да, проблема в том, что вопрос не очень хорошо сформулирован. – carlspring

+0

Натан Хьюз читал это правильно. Я только что добавил код, надеюсь, теперь он станет понятнее. – deinocheirus

Смежные вопросы