Обратная связь представляет собой определённую сложность для финализированного списка в Java, ведь все элементы должны косвенно ссылаться друг на друга, а установка финализированного значения возможна только внутри конструктора. Это препятствие можно преодолеть с помощью простого советского ... рекурсивного конструктора.
public final class Node<T> {
final T value;
final Node next;
private Node(Iterator<T> values, Node head) {
this.value = values.next();
if (values.hasNext()) {
this.next = new Node(values, head);
} else {
this.next = head;
}
}
public Node(Iterable<T> values) {
Iterator it;
it = values.iterator();
this.value = it.next();
if (it.hasNext()) {
this.next = new Node(it, this);
} else {
this.next = this;
}
}
}
Node<T> list = new Node(Arrays.asList(1, 2, 3));
Более удачно спроектированный язык должен позволять обходиться без рекурсии. Впрочем, слово «удачно» здесь может быть спорным, так как такой язык, вероятно, не может не быть сложней понятийно. Например, так:
public final class Node<T> {
fixed T value;
Node next;
private isolated Node(fixed T value) {
this.value = value;
}
public static isolated Node create(Iterable<fixed T> values) {
isolated { Node head, cur; };
Iterator<fixed T> it;
it = values.iterator();
head = new Node(it.next());
cur = head;
while (it.hasNext()) {
cur.next = new Node(it.next());
cur = cur.next;
}
cur.next = head;
return head;
}
}
fixed Node<T> list = Node.create(Arrays.asList(1, 2, 3));
Характеристики fixed
, isolated
могли бы отслеживаться в неявном виде за счёт дополнительного усложнения транслятора, и тогда бы для программиста это могло выглядеть как просто вопрос написания правильного кода. Проблема в том, что просто, да не просто, потому что в случае ошибки, сложно было бы объяснить, как эти неявные модификаторы взаимодействуют по цепи причин и следствий, и приводят к такой диагностике.
Комментариев нет:
Отправить комментарий