Я хочу реализовать Visitor for My class MyList
.Сам список содержит элементы типа MyEntry
.Эти записи содержат общее значение и ссылку на следующую запись в списке.
public class MyEntry<E> implements Visitable {
MyEntry<E> next;
E o;
MyEntry() {
this(null, null);
}
MyEntry(E o) {
this(o, null);
}
MyEntry(E o, MyEntry<E> e) {
this.o = o;
this.next = e;
}
public void accept(Visitor visitor) {
}
}
Класс списка
public class MyList<E> implements Visitable {
private MyEntry<E> begin;
private MyEntry<E> pos;
public MyList() {
pos = begin = new MyEntry<E>();
}
public void add(E x) {
MyEntry<E> newone = new MyEntry<E>(x, pos.next);
pos.next = newone;
}
public void advance() {
if (endpos()) {
throw new NoSuchElementException("Already at the end of this List");
}
pos = pos.next;
}
public void delete() {
if (endpos()) {
throw new NoSuchElementException("Already at the end of this List");
}
pos.next = pos.next.next;
}
public E elem() {
if (endpos()) {
throw new NoSuchElementException("Already at the end of this List");
}
return pos.next.o;
}
public boolean empty() {
return begin.next == null;
}
public boolean endpos() {
return pos.next == null;
}
public void reset() {
pos = begin;
}
@Override
public void accept(Visitor visitor) {
begin = pos;
while(pos.next != null && visitor.visit(pos.o)) {
//Move one Item forward
pos = pos.next;
}
}
Я реализовал интерфейс Visitor
для моего ListVisitor
класса
public class ListVisitor implements Visitor {
public ListVisitor() {
}
@Override
public boolean visit(Object o) {
return false;
}
}
Интерфейс Visitor
, которыйбудет реализован в каждом новом посетителе, которого я хочу создать, пока у меня есть только ListVisitor
public interface Visitor<E> {
boolean visit(Object o);
}
и интерфейс Visitable, который реализован в каждом классе, который я хочу посетить, в этом случаекласс MyList и класс MyEntry.
public interface Visitable {
public void accept(Visitor visitor);
}
Чтобы протестировать реализацию шаблона Visitor, я создал Testclass, который создает новый Mylist и помещает в него несколько строк.Затем он создает нового посетителя, который посещает список.
import org.junit.Test;
public class MyListTest {
@Test
public void MyListTest() {
MyList s = new MyList();
s.add("Hello");
s.add("World");
s.add("!");
Visitor v = new Visitor() {
@Override
public boolean visit(Object o) {
System.out.println(o);
return true;
}
};
s.accept(v);
}
}
Теперь, когда я запускаю MyListTest, вывод будет:
null
!
World
Мой вопрос теперь, почему первый Элемент, который посетительпосещения имеет нулевую ссылку в нем.Когда я добавляю больше элементов в свой список перед созданием посетителя, вывод всегда расширяется, за исключением первого элемента, который был вставлен в список, он всегда будет нулевым.