package org.sothis.dal.query; import java.util.Iterator; /** * 提供简便的方法来生成{@code name}或{@code name value}的链表 * * @author velna * */ public class Chain implements Iterable<Chain> { private String name; private Object value; private Chain next; private ChainParent parent; protected Chain(String name, Object value) { this.name = name; this.value = value; } protected Chain() { this.parent = new ChainParent(this); } /** * 创建一个名值对链表 * * @param name * @param value * @return */ public static Chain make(String name, Object value) { if (null == name) { throw new IllegalArgumentException("name can not be null"); } Chain chain = new Chain(name, value); ChainParent parent = new ChainParent(chain); parent.size++; chain.parent = parent; return chain; } /** * 创建一个只有名的链表 * * @param name * @return */ public static Chain make(String name) { return make(name, null); } /** * 创建一个空的链表 * * @return */ public static Chain make() { return new Chain(); } /** * 添加一个名值对 * * @param name * @param value * @return */ public synchronized Chain add(String name, Object value) { if (this.name == null) { this.name = name; this.value = value; this.parent.size++; return this; } else { Chain chain = new Chain(name, value); chain.parent = this.parent; chain.next = this.next; this.next = chain; this.parent.size++; return chain; } } /** * 添加一个名 * * @param name * @return */ public synchronized Chain add(String name) { return add(name, null); } /** * 得到链表的下一个节点 * * @return */ public Chain next() { return this.next; } /** * 得到链表的所有节点数量 * * @return */ public int size() { return this.parent.size; } /** * 得到本节点的名 * * @return */ public String name() { return name; } /** * 得到本节点的值 * * @return */ public Object value() { return value; } @Override public Iterator<Chain> iterator() { return new ChainIterator(this.parent.head); } private static class ChainParent { final Chain head; int size; public ChainParent(Chain head) { this.head = head; } } private static class ChainIterator implements Iterator<Chain> { private Chain head; public ChainIterator(Chain head) { this.head = head; } @Override public boolean hasNext() { return this.head != null; } @Override public Chain next() { Chain ret = head; head = head.next; return ret; } @Override public void remove() { throw new UnsupportedOperationException("remove is not allowed"); } } }