Я занимаюсь рефакторингом какого-то устаревшего кода и столкнулся с проблемой, которая, я уверен, имеет элегантное решение, - но я не могу до нее добраться.
Изначально была загружена классы, которые расширяли абстрактный класс BaseType
. У каждого из этих классов есть перечисление - XmlElementTag
- со значениями, специфичными для класса:
enum XmlElementTag {value1, value2, value3}
У каждого из них также есть метод:
private XmlElementTag getTag(String s){
XmlElementTag ret = null;
try {
ret = XmlElementTag.valueOf(s);
} catch (Exception e) {
Log.e(this, s+" is not supported tag");
}
return ret;
}
Каждый класс имеет такой же метод getTag
, но, очевидно, все они ссылаются на перечисление XmlElementTag
, специфичное для класса, в котором они находятся. Итак, я хотел бы избавиться от этого дублирования кода, если смогу .
Я подумал, что, возможно, я мог бы использовать интерфейс маркера для решения этой проблемы, поэтому создал такой, который каждое перечисление XmlElementTag
теперь наследует, переписал метод getTag
и поместил его в суперкласс.
Итак, у меня есть это в каждом классе:
private XmlElementTag implements GenericTag {value1, value2, value3};
И это в суперклассе BaseType:
public interface GenericTag {}
protected GenericTag getTag(String tagName){
XmlElementTag tag = null;
try {
tag = XmlElementTag.valueOf(tagName);
} catch (Exception e) {
Log.e(this, tagName+" is not supported tag");
}
return tag;
}
Но опять же, это не работает, поскольку суперкласс BaseType
не знает, что такое XmlElementTag
; Java не допускает абстрактные переменные класса; и создание этого элемента в BaseType
не будет работать, так как код getTag
всегда будет ссылаться на это перечисление, а не на класс в классе, который расширяет BaseType
.
Кто-нибудь может указать мне правильное направление?