2014-09-18 2 views
0

제네릭을 사용하여 빌더 패턴을 구현하는 것이 좋습니다. 이론적으로는 만들 반사를 사용하는 것이 가능할 것이다 가능한 다음 리플렉션을 사용하는 일반 빌더 패턴 클래스

public class CursistBuilder { 
     private Cursist cursist = null; 

     private CursistBuilder() { 
      cursist = new Cursist("username not set", "email not set"); 
     } 

     public static CursistBuilder aCursist() { 
      return new CursistBuilder(); 
     } 

     public CursistBuilder withNaam(String name) { 
      cursist.setGebruikersnaam(name); 
      return this; 
     } 

     public CursistBuilder withEmail(String email) { 
      cursist.setEmail(email); 
      return this; 
     } 

     public Cursist build() { 
      return cursist; 
     } 
    } 

가 어떻게이 수행 할 수 있습니다

MyClass myClass = GenericBuilder<MyClass>.aObject() 
      .withThisProperty("foo") 
      .withThatProperty(4) 
      .build(); 

는 이미 다음 코드를했다?

답변

2

객체가 create 기능에서 생성되지 않는 것이 적절한 빌더 패턴이 아니라 당신이 개선을위한 참고 자료로 사용할 수

public static class Builder<T> { 
     public final T instance; 

     public Builder(Class<T> clazz) throws InstantiationException, 
       IllegalAccessException { 
      super(); 
      this.clazz = clazz; 
      this.instance = clazz.newInstance(); 
     } 

     private final Class<?> clazz; 

     Builder<T> setProperty(String name, Object value) 
       throws IllegalAccessException, IllegalArgumentException, 
       InvocationTargetException, NoSuchMethodException, 
       SecurityException { 

      Method method = clazz.getMethod("set" 
        + name.substring(0, 1).toUpperCase() + name.substring(1), 
        value.getClass()); 
      method.invoke(instance, value); 
      return this; 
     } 

     T create() { 
      return instance; 
     } 
    } 

그것을 사용하는 방법 : 요 빌더의 인스턴스를 생성됩니다 클래스를 전달하여

Builder<MyClass> builder = new Builder<>(MyClass.class);

를 생성자 다음, 개체에

,617을 세터를 호출하는 방법 setProperty(String name, Object value)를 사용하는

무엇을 할 수 있을까요? 예를 들어 클래스에 대한 일부 기본값을 전달하고 args가없는 생성자를 사용하지 마십시오.

+0

작성자 패턴을 사용하는 버전을 생성했습니다 : –

+0

[여기에 코드가 있습니다.] (http://derrickbowen.com/blog/content/제네릭 빌더 패턴 클래스 사용 제네릭 반사) –

0

내가 너라면하지만 내가 좋아 구현하는 것, 이것은 당신이 원하는 무엇을 모르는 아래 // >>

주요

public class Main { 
    public static void main(String[] args) { 
     GenericBuilder gb = GenericBuilder.getInstance(); 
     gb= 
     gb.withThisProperty("String", "AAAAAA"). 
     withThisProperty(4, 9). 
     withThisProperty(5.8f, 6.7f). 
     withThisProperty("Array", new ArrayList<String>()).build(); 

     System.out.println(gb.toString()); 
    } 
}; 

VO >>

public class GenericBuilder { 

    private Map<Object, Object> map; 

    // Implementation of Singleton 
    private GenericBuilder(){ 
     map = new HashMap<Object, Object>(); 
    } 

    private static class LazyLoader{ 
     private static final GenericBuilder INSTANCE = new GenericBuilder(); 
    } 

    public static GenericBuilder getInstance(){ 
     return LazyLoader.INSTANCE; 
    } 
    //End Singleton 

    public GenericBuilder withThisProperty(Object key, Object param){ 
     map.put(key, param); 
     return this; 
    } 

    public Object get(Object key){ 
     return map.get(key); 
    } 

    public GenericBuilder build(){ 
     return this; 
    } 

    @Override 
    public String toString() { 
     StringBuffer returnVal = new StringBuffer(); 
     Iterator<Object> iter = map.keySet().iterator(); 
     while(iter.hasNext()){ 
      Object key = iter.next(); 
      returnVal.append("key >> " + key + " value >> " + map.get(key) + "\n"); 
     } 
     return returnVal.toString(); 
    } 
} 

나는 toString()을 오버라이드하여 그 안에 무엇이 있는지 보여주고 다른 콜렉션과 함께 이것을 바꿀 수 있도록 맵을 선언하여 어딘가에 값을 할당한다. 감사합니다/