Java 枚举中的泛型类型&;构建器模式
我正在尝试创建一个生成器模式,它使用泛型对一些方法提供类型检查。目前我有以下工作:Java 枚举中的泛型类型&;构建器模式,java,generics,type-erasure,Java,Generics,Type Erasure,我正在尝试创建一个生成器模式,它使用泛型对一些方法提供类型检查。目前我有以下工作: ParameterBuilder.start(String.class).setName("foo").setDefaultValue("Hello").build(); ParameterBuilder.start(Integer.class).setName(bar).setDefaultValue(42).build(); ParameterBuilder.start(Boolean.class).setN
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
}
其中,电子邮件和URL是枚举,其中包含默认值的类。但是如果我走这条路,我将如何实例化参数生成器
public static <T2> ParameterBuilder<T2> start(ParameterType paramType) {
Class<T2> type = paramType.getTypeClass();
// How do I instantiate my ParameterBuilder with the right type?
}
publicstaticparameterbuilder启动(ParameterType paramType){
Class type=paramType.getTypeClass();
//如何用正确的类型实例化ParameterBuilder?
}
如果无法使用枚举(我可以看到这种情况),是否有人对其他解决方案有建议?我不确定您希望使用此解决方案的上下文,但我认为以下可能是一种选择 您可以遵循打开/关闭原则,创建一个接口
参数
,每个类型有一个实现。这样做的好处是,您不需要为所需的每个新参数添加新的枚举值。您可以稍后将类传递给ParameterBuilder
而不是enum,ParameterBuilder
和Parameter
将共同构建您需要的内容
因此ParameterBuilder.start()
可以返回特定参数的实例
,根据参数的类型,该参数可能有不同的方法
我认为这个答案不是很好,但希望能给你一个提示,告诉你如何为你的上下文构建一个潜在的解决方案。你可以为这些电子邮件和Url类型创建一个对象层次结构
public class DefaultType {
protected String name;
protected String defaultValue;
//some constructor
}
public class EmailType extends DefaultType {
...
}
public class URLType extends DefaultType {
...
}
然后,参数生成器可以如下所示:
public static ParameterBuilder start(DefaultType type) {
ParameterBuilder builder = new ParameterBuilder(type);
builder.setType(type);
return builder;
}
ParameterBuilder.start(new EmailType("name","value");...
那么你可以这样称呼它:
public static ParameterBuilder start(DefaultType type) {
ParameterBuilder builder = new ParameterBuilder(type);
builder.setType(type);
return builder;
}
ParameterBuilder.start(new EmailType("name","value");...
这是否有帮助?您是否希望朝这个方向发展?我认为您需要为每个类类型提供一个枚举(我不知道如何让一个枚举覆盖多个类型并保持工作状态)。在这种情况下,一个通用的通用接口可以实现您想要的功能。然后,如果有帮助,您可以创建某种工厂来提供枚举常量 这包括:
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() {}
}
静态接口参数类型{}
静态枚举参数类型枚举实现参数类型{EMAIL;}
公共静态void main(字符串[]args){
参数生成器
.start(参数typeenum.EMAIL)
.setName(“电子邮件”)
.setDefaultValue(“foo@bar.com")
.build();
}
公共静态类参数生成器{
私有字符串名称;
私人T值;
公共静态ParameterBuilder启动(ParameterType paramType){
返回新的参数生成器();
}
ParameterBuilder setName(字符串名称){
this.name=名称;
归还这个;
}
参数生成器setDefaultValue(T defaultValue){
this.defaultValue=defaultValue;
归还这个;
}
void build(){}
}
你能告诉我什么是电子邮件
,网址
。它们是两个不同的枚举吗?它们是两个枚举的实例吗?它们是什么?在我的例子中,我有一个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”);//遵循的方法
这听起来是一种明智的方法。这样我就可以使用StringParameterEnum、IntegerParameterEnum等,这样代码仍然很干净。谢谢