Próbuję utworzyć wzorzec konstruktora, który używa generycznych, aby zapewnić sprawdzanie typów na niektórych metodach. Obecnie mam następujący robocza:Generic Type From Enum & The Builder Pattern
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();
Używanie kod:
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
}
Więc rodzaj wejścia dla metody setDefaultValue
jest zdefiniowana przez co przeszła w sposobie start
, tak jak chcę.
Ale teraz chcę rozszerzyć to, co jest przekazywane do start()
, aby zawierało trochę więcej informacji. Zasadniczo chcę przekazać "typ" dla parametrów, które tworzę. Czasami te parametry będą takie rzeczy jak „email”, „URL” itp Domyślna wartość nadal będzie typu znane (String w tych przypadkach), więc chciałbym mieć coś takiego:
ParameterBuilder.start(EMAIL).setName("email").setDefaultValue("[email protected]").build();
ParameterBuilder.start(URL).setName("website").setDefaultValue("http://www.somewhere.com").build();
Adresy URL EMAIL & są wyliczeniami, zawierającymi między innymi - klasę wartości domyślnej. Ale jeśli pójdę tą drogą, w jaki sposób mogę utworzyć instancję konstruktora parametrów?
public static <T2> ParameterBuilder<T2> start(ParameterType paramType) {
Class<T2> type = paramType.getTypeClass();
// How do I instantiate my ParameterBuilder with the right type?
}
Jeśli nie można zrobić za pomocą teksty stałe (które mogę zobaczyć bycia przypadku), czy ktoś ma propozycję dla innego rozwiązania?
można pokazać, co dokładnie jest 'EMAIL',' URL'. Czy są to 2 różne wyliczenia? Czy są to przypadki dwóch wyrażeń? Czym oni są? –
W moim przypadku miałem ParameterType echoing coś w stylu: '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"); // Metody zastosowane " –