Я проектирую некоторые Java-объекты для представления графиков и деревьев.Для моего случая использования я буду использовать оба типа данных, но я также хочу, чтобы мои алгоритмы графа работали на моих деревьях.
import java.util.List;
public interface Node<T> {
T getValue();
List<? extends Node<T>> getNeighbors();
void addNodes(List<? extends Node<T>> nodes);
}
public interface TreeNode<T> extends Node<T> {
List<? extends TreeNode<T>> getChildren();
void addChildren(List<? extends TreeNode<T>> treeNodes);
@Override
default List<? extends Node<T>> getNeighbors() {
return getChildren();
}
@Override
default void addNodes(List<? extends Node<T>> nodes) {
if(nodes.getClass().isInstance(getChildren().getClass())) {
addChildren((List<? extends TreeNode<T>>) nodes);
} else {
throw new RuntimeException("Type error!");
}
}
}
Мой вопрос о том, как я имею дело с методом addNodes в интерфейсе Node винтерфейс TreeNode.Метод addNodes должен быть в интерфейсе Node, потому что я хочу позволить людям писать код, который может добавлять узлы в графы.Однако я также не хочу, чтобы люди добавляли произвольные узлы к узлу дерева (например, добавляли узел графа к узлу дерева).
Чтобы это предотвратить, я проверяю тип узловво время выполнения и выдачи исключения, если тип не правильный.Мне просто интересно, если это лучший способ выполнить то, что я хочу, или есть лучшая практика?
Спасибо за помощь :)