2013-08-07 59 views
5

我想創建一個生成器模式,使用泛型提供一些方法的類型檢查。目前,我有以下工作:通用類型從枚舉&生成器模式

ParameterBuilder.start(String.class).setName("foo").setDefaultValue("Hello").build(); 
ParameterBuilder.start(Integer.class).setName(bar).setDefaultValue(42).build(); 
ParameterBuilder.start(Boolean.class).setName(bar).setDefaultValue(false).build(); 

使用代碼:

public class ParameterBuilder<T> { 
    private String name; 
    private T defaultValue; 

    public static <T2> ParameterBuilder<T2> start(Class<T2> type) { 
    return new ParameterBuilder<T2>(); 
    } 
    // Other methods excluded for example 
} 

所以其輸入爲setDefaultValue方法的類型是什麼傳入start方法定義,只是因爲我想要的。

但現在我想擴展什麼正在傳遞到start()包含多一點的信息。本質上,我想爲我創建的參數傳遞一個「類型」。有時,這些參數會像「電子郵件」,「網址」等的默認值將仍然是一個已知類型(字符串在那些情況下),所以我想有這樣的:

ParameterBuilder.start(EMAIL).setName("email").setDefaultValue("[email protected]").build(); 
ParameterBuilder.start(URL).setName("website").setDefaultValue("http://www.somewhere.com").build(); 

目前,EMAIL & URL是枚舉,其中包含默認值的類。但是如果我沿着這條路線走下去,我將如何實例化參數生成器?

public static <T2> ParameterBuilder<T2> start(ParameterType paramType) { 
    Class<T2> type = paramType.getTypeClass(); 
    // How do I instantiate my ParameterBuilder with the right type? 
} 

如果不能使用枚舉(我可以看到既然如此)來完成,沒有任何人有不同的解決方案有何建議?

+1

你能告訴究竟是什麼'EMAIL','URL'。他們是兩個不同的枚舉?他們是兩個枚舉的實例嗎?他們是什麼? –

+0

在我的情況下,我有一個ParameterType回顯類似於:'public enum ParameterType {STRING(String.class,「String」),INTEGER(Integer.class,「Integer」),MULTILINE(String.class,「Multine Text」 ),HTML(String.class,「HTML」),DATE(Date.class,「Date」),BOOLEAN(Boolean.class,「Boolean」); //遵循的方法' –

回答

2

我想你需要每類類型一個枚舉(我不明白你怎麼能有一個枚舉蓋幾種類型,並保持事情的工作)。在這種情況下,一個通用的通用接口可以做你想做的事情。如果有幫助的話,你可以創建一些工廠來提供枚舉常量。

這編譯:

static interface ParameterType<T> {} 

static enum ParameterTypeEnum implements ParameterType<String> { EMAIL; } 

public static void main(String[] args) { 
    ParameterBuilder 
      .start(ParameterTypeEnum.EMAIL) 
      .setName("email") 
      .setDefaultValue("[email protected]") 
      .build(); 
} 

public static class ParameterBuilder<T> { 

    private String name; 
    private T defaultValue; 

    public static <T2> ParameterBuilder<T2> start(ParameterType<T2> paramType) { 
     return new ParameterBuilder<T2>(); 
    } 

    ParameterBuilder<T> setName(String name) { 
     this.name = name; 
     return this; 
    } 

    ParameterBuilder<T> setDefaultValue(T defaultValue) { 
     this.defaultValue = defaultValue; 
     return this; 
    } 

    void build() {} 
} 
+0

這聽起來像是一個明智的做法。這樣我可以有StringParameterEnum,IntegerParameterEnum等,這仍然會使代碼很乾淨。謝謝 –

0

我不知道你想用這個東西的情況下,但我認爲下面可能是一個選項。

您可以按照開/關的原則,創建一個接口Parameter和有每種類型一個實現。這樣做的好處是,你不需要爲每個你想要的新參數添加一個新的枚舉值。您可以稍後將該類傳遞給ParameterBuilder而不是枚舉,並且ParameterBuilderParameter將一起工作以構建您所需的內容。

因此ParameterBuilder.start()可能會返回特定的Parameter的實例,並且該參數可能有不同的方法,具體取決於參數的類型。

我不認爲這個答案是真的很不錯,但希望可以給你如何建立你的背景下,潛在的解決方案的提示。

0

你可以創建這些電子郵件和網址類型

public class DefaultType { 
    protected String name; 
    protected String defaultValue; 
    //some constructor 
} 

public class EmailType extends DefaultType { 
    ... 
} 

public class URLType extends DefaultType { 
    ... 
} 

對象hierachie則參數生成器可以是這個樣子:

public static ParameterBuilder start(DefaultType type) { 
    ParameterBuilder builder = new ParameterBuilder(type); 
    builder.setType(type); 
    return builder; 
} 

然後,你可以這樣調用它:

ParameterBuilder.start(new EmailType("name","value");... 

這是否幫助或不想要這個方向走?