Страницы

Финализированный кольцевой список на Java

Обратная связь представляет собой определённую сложность для финализированного списка в 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 могли бы отслеживаться в неявном виде за счёт дополнительного усложнения транслятора, и тогда бы для программиста это могло выглядеть как просто вопрос написания правильного кода. Проблема в том, что просто, да не просто, потому что в случае ошибки, сложно было бы объяснить, как эти неявные модификаторы взаимодействуют и приводят к такой диагностике.

Комментариев нет:

Отправить комментарий