java - Generic Type From Enum & The Builder Pattern -
i'm trying create builder pattern uses generics provide type checking on of methods. have following working:
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();
using 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 example }
so type of input setdefaultvalue
method defined what's passed start
method, want.
but want extend what's being passed start()
contain little more information. want pass in "type" parameters creating. these parameters things "email", "url" etc. default value still of known type (string in cases), i'd have like:
parameterbuilder.start(email).setname("email").setdefaultvalue("foo@bar.com").build(); parameterbuilder.start(url).setname("website").setdefaultvalue("http://www.somewhere.com").build();
where @ moment email & url enums, containing amongst other things - class of default value. if go down route, how instantiate parameter builder?
public static <t2> parameterbuilder<t2> start(parametertype paramtype) { class<t2> type = paramtype.gettypeclass(); // how instantiate parameterbuilder right type? }
if can't done using enums (which can see being case), have suggestion different solution?
i think need 1 enum per class type (i don't see how have 1 enum cover several types , keep thing working). in case, common generic interface want. can create sort of factory provide enum constants if helps.
this compiles:
static interface parametertype<t> {} static enum parametertypeenum implements parametertype<string> { email; } public static void main(string[] args) { parameterbuilder .start(parametertypeenum.email) .setname("email") .setdefaultvalue("foo@bar.com") .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() {} }
Comments
Post a Comment