Страницы

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

Характеристика isolated для простоты языка могла бы отслеживаться в неявном виде за счёт дополнительного усложнения транслятора, и тогда бы для программиста это могло выглядеть как просто вопрос написания правильного кода. Проблема в том, что просто, да не просто, потому что в случае ошибки, сложно было бы объяснить, как неявная характеристика взаимодействует по цепи причин и следствий, и приводит к такой диагностике.

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

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