Я пишу пространственную структуру данных и сомневаюсь в том, что является лучшей реализацией NODE.
В соответствии с моим дизайном у меня есть абстрактная сущность узла и три класса, которые наследуются от него: EMPTYNODE, FULLNODE, INTERNALNODE.
Первый не имеет конкретных данных.
Второй имеет 1 ссылку на общий элемент.
Третий имеет 2 ссылки на другие узлы.
Я нашел несколько способов реализовать эту ситуацию (которую я уже кодировал), но я не могу решить, что лучше.
Первое решение, которое я нашел, - это использование единственного класса Node, который потенциально выполняет все операции следующим образом:
private static class Node {
private Elem elem = null;
private Node left = null, right = null;
public Elem getElem() {
assert isFull();
return elem;
}
public boolean isEmpty() {
return elem == null && left == null;
}
public boolean isFull() {
return elem != null;
}
public boolean isInternal() {
return elem == null && left != null;
}
}
Второе решение - написать явное деление по классам, где каждый класс предлагает только свои методы. Очевидно, что таким образом мы обязаны выполнить несколько приведений к объектам узла.
private static abstract class Node {
public abstract boolean isEmpty();
public abstract boolean isFull();
public abstract boolean isInternal();
}
private static class FullNode extends Node{
private ITriangle elem;
@Override
public boolean isEmpty() {
return false;
}
@Override
public final boolean isFull() {
return true;
}
@Override
public final boolean isInternal() {
return false;
}
public Elem getElem() {
return elem;
}
}
Третье решение заключается в использовании наследования, позволяющего каждому классу предлагать все методы, но тип объекта должен проверяться методом "isEmpty ()" и аналогичными методами. В случае неправильного вызова мы сгенерируем исключение.
private static abstract class Node {
public abstract boolean isEmpty();
public abstract boolean isFull();
public abstract boolean isInternal();
public abstract Elem getElem();
}
private static class Empty extends Node{
@Override
public boolean isEmpty() {
return true;
}
@Override
public final boolean isFull() {
return false;
}
@Override
public final boolean isInternal() {
return false;
}
@Override
public Elem getElem() {
throw new AssertionError();
}
}
Что вы думаете об этих трех решениях?
Какой из них вы бы использовали?
Любые идеи будут оценены.