001package gu.dtalk; 002 003import static com.google.common.base.Preconditions.*; 004 005import java.lang.reflect.Modifier; 006import java.util.Collection; 007import java.util.List; 008 009import com.google.common.base.Throwables; 010 011/** 012 * 菜单条目构造器 013 * @author guyadong 014 * 015 * @param <T> 016 */ 017public class ItemBuilder<T extends BaseItem> { 018 019 protected final T item; 020 public ItemBuilder(T item) { 021 super(); 022 this.item = item; 023 } 024 public ItemBuilder<T> name(String name) { 025 item.setName(name); 026 return this; 027 } 028 029 public ItemBuilder<T> disable(boolean disable) { 030 item.setDisable(disable); 031 return this; 032 } 033 034 public ItemBuilder<T> description(String description) { 035 item.setDescription(description); 036 return this; 037 } 038 039 public ItemBuilder<T> uiName(String uiName) { 040 item.setUiName(uiName); 041 return this; 042 } 043 044 public ItemBuilder<T> childs(List<BaseItem> childs) { 045 checkState(item.isContainer(),"%s isn't container",item.getClass().getSimpleName()); 046 item.setChilds(childs); 047 return this; 048 } 049 050 public ItemBuilder<T> addChilds(BaseItem... childs) { 051 checkState(item.isContainer(),"%s isn't container",item.getClass().getSimpleName()); 052 item.addChilds(childs); 053 return this; 054 } 055 056 public ItemBuilder<T> addChilds(Collection<BaseItem> childs) { 057 checkState(item.isContainer(),"%s isn't container",item.getClass().getSimpleName()); 058 item.addChilds(childs); 059 return this; 060 } 061 062 public T instance(){ 063 return item; 064 } 065 public static <T extends BaseItem>ItemBuilder<T> builder(T instance) { 066 return new ItemBuilder<T>(checkNotNull(instance,"instance is null")); 067 } 068 public static <T extends BaseItem>ItemBuilder<T> builder(Class<T> type) { 069 // 不允许为抽象类 070 checkArgument(!Modifier.isAbstract(type.getModifiers()),"%s is a abstract class",type.getName()); 071 try { 072 return new ItemBuilder<T>(type.newInstance()); 073 } catch (Exception e) { 074 Throwables.throwIfUnchecked(e); 075 throw new RuntimeException(e); 076 } 077 } 078}