Ich versuche, ein Builder-Muster zu erstellen, das Generics verwendet, um eine Typüberprüfung für einige der Methoden bereitzustellen. Zur Zeit habe ich folgende Arbeiten:Generische Art von Enum & Builder-Muster
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();
mit dem Code:
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
}
So ist die Art der Eingabe für die setDefaultValue
Methode wird definiert durch das, was in die start
Methode übergeben wird, so wie ich will.
Aber jetzt möchte ich erweitern, was in start()
übergeben wird, um ein wenig mehr Informationen zu enthalten. Im Wesentlichen möchte ich einen "Typ" für die Parameter, die ich erstelle, übergeben. Manchmal werden diese Parameter Dinge wie „E-Mail“, „url“ usw. Der Standardwert nach wie vor von einer bekannten Art sein wird (String) in denjenigen Fällen, so möchte ich etwas haben, wie:
ParameterBuilder.start(EMAIL).setName("email").setDefaultValue("[email protected]").build();
ParameterBuilder.start(URL).setName("website").setDefaultValue("http://www.somewhere.com").build();
Wo im Moment EMAIL & URL enums sind, enthält unter anderem - die Klasse des Vorschlagswerts. Aber wenn ich diesen Weg gehen würde, wie würde ich den Parameter Builder instanziieren?
public static <T2> ParameterBuilder<T2> start(ParameterType paramType) {
Class<T2> type = paramType.getTypeClass();
// How do I instantiate my ParameterBuilder with the right type?
}
Wenn es nicht mit Aufzählungen getan werden kann (was ich der Fall sehen kann), hat jemand einen Vorschlag für eine andere Lösung?
Können Sie zeigen, was genau ist 'EMAIL',' URL'. Sind das 2 verschiedene Enums? Sind das Instanzen von zwei enums? Was sind Sie? –
In meinem Fall hatte ich eine ParameterType, die so etwas wie: public enum ParameterType {STRING (String.class, "String"), INTEGER (Integer.class, "Integer"), MULTILINE (String.class, "Multite Text")), HTML (String.class, "HTML"), DATUM (Date.class, "Date"), BOOLEAN (Boolean.class, "Boolean"); // Methoden folgen " –