У меня есть описание данных интерфейса:Могу ли я перегрузить метод интерфейса в Java?
public interface DataDescription {
int getId();
}
И две реализации:
public class DataWithId1 implements DataDescription {
// ... simple getter impl.
}
public class OtherDataWithId implements DataDescription {
// ... simple getter impl.
}
Теперь у меня есть этот интерфейс:
public interface DataProcessor {
void process(DataDescription data);
}
Я хотел бы реализовать DataProcessor
с одним классом , что-то вроде этого:
public class DataProcessorImpl implements DataProcessor {
@Override
public void process(DataDescription data) {
// Do something...
}
public void process(DataWithId1 data) {
// Do something specific with this type (e.g. directly store in table of database)
}
public void process(OtherDataWithId data) {
// Do something specific with this type (convert to format DataWithId1 and then store in DB)
}
}
И некоторый код, чтобы назвать его:
public Main {
private DataProcessor dataProcessor = new DataProcessor();
public static void main(String[] args) {
DataDescription data = new DataWithId1(1);
dataProcessor.process(data);
}
}
То, что я хотел бы добиться того, что DataProcessor
абонента не придется беспокоиться о преобразовании данных (они имеют DataDescription
и не должны знать о двух типах). Кроме того, я хотел бы избежать кода instanceof
.
Предположение, которое я сделал, заключается в том, что я могу перегрузить интерфейсный метод, подобный этому. Я не смог найти доказательства для этого, глядя на section 15.12 of the java language specification (что не значит, что его там нет).
Является ли мое предположение о перегрузке правильной? Могу ли я избежать instanceof
?
Я вижу, что метод accept принимает Impl как аргумент. Здесь можно использовать интерфейс 'DataProcessor'? – Timo
Ну, вы можете, если вы объявите все методы 'process' в интерфейсе' DataProcessor'. Но тогда их слишком легко сбить с помощью метода front-end 'process'. Самое чистое решение состояло бы в том, чтобы иметь два интерфейса: интерфейс * Visitor *, используемый методом 'accept', и интерфейс DataProcessor для используемого сайта (здесь, метод' main'). Затем «DataProcessorImpl» может реализовывать оба интерфейса. Таким образом, метод 'main' не должен знать о интерфейсе посетителя, а методы' accept' не должны знать о DataProcessor' (в будущем могут быть и другие посетители). – Holger
Я думаю, что ваше предложение для двух интерфейсов - единственный способ получить это чистое. Если вы не используете два интерфейса, всевозможные детали реализации обойдутся в коде, например, 'DataDescription' должен знать, какие реализации DataProcessor являются релевантными. – Timo