Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用enum清除过多的代码_Java_Java 8_Code Cleanup - Fatal编程技术网

Java 如何使用enum清除过多的代码

Java 如何使用enum清除过多的代码,java,java-8,code-cleanup,Java,Java 8,Code Cleanup,我有下面的代码要写。它采用一种枚举类型并返回另一个枚举值。如何删除代码中过多的if-else条件并使其干净 私有静态QuestionType解析QuestionType(QuestionTypeInfo QuestionTypeInfo){ if(问题类型信息OpenEndExtQuestionTypeInfo实例){ 返回问题类型。未结束; }else if(问题类型信息多选项问题类型信息实例){ 返回问题类型。多选; }else if(矩阵的questionTypeInfo实例SingleP

我有下面的代码要写。它采用一种枚举类型并返回另一个枚举值。如何删除代码中过多的if-else条件并使其干净

私有静态QuestionType解析QuestionType(QuestionTypeInfo QuestionTypeInfo){
if(问题类型信息OpenEndExtQuestionTypeInfo实例){
返回问题类型。未结束;
}else if(问题类型信息多选项问题类型信息实例){
返回问题类型。多选;
}else if(矩阵的questionTypeInfo实例SinglePerrowQuestionTypeInfo){
返回QuestionType.MATRIX\u每行单个\u;
}else if(问题类型信息openedTextQuestionTypeInfo实例){
返回问题类型。未结束;
}else if(矩阵的questionTypeInfo实例MultiperRowQuestionTypeInfo){
返回QuestionType.MATRIX\u每行多个;
}else if(矩阵的questionTypeInfo实例SideBySideQuestionTypeInfo){
返回QuestionType.MATRIX\u SIDE\u BY\u SIDE;
}else if(矩阵的questionTypeInfo实例PreadsheetQuestionTypeInfo){
返回问题类型。矩阵\数据表;
}else if(数据列表的questionTypeInfo实例questionTypeInfo){
返回QuestionType.DATA\u列表;
}else if(文件上传的questionTypeInfo实例questionTypeInfo){
返回QuestionType.FILE\u上传;
}else if(交互的问题类型信息实例LidingScaleQuestionTypeInfo){
返回问题类型。交互式\u滑动\u比例;
}else if(NetPromotor的questionTypeInfo实例questionTypeInfo){
返回QuestionType.NET\u发起人;
}else if(问题类型信息RankOrderQuestionTypeInfo实例){
返回问题类型。排名顺序;
}else if(PresentationHeader的问题类型信息实例问题类型信息){
返回QuestionType.PRESENTATION\u标题;
}else if(呈现的问题类型信息实例HTMLQuestionTypeInfo){
返回QuestionType.PRESENTATION\u HTML;
}else if(自动递增的questionTypeInfo实例questionTypeInfo){
返回QuestionType.AUTO_增量;
}else if(单一选项的questionTypeInfo实例questionTypeInfo){
返回问题类型。单选;
}
返回null;
}

你可以像其他人建议的那样使用
地图,但我个人会利用授权,如果对你来说有意义的话。在
QuestionTypeInfo
界面中,声明一个抽象方法
getQuestionType
,该方法返回
QuestionType
枚举的实例,并在其所有实现中使用适当的值覆盖它

接口问题类型信息{
QuestionType getQuestionType();
}
枚举OpenEndextQuestionTypeInfo实现QuestionTypeInfo{
@凌驾
公共问题类型getQuestionType(){
返回问题类型。未结束;
}
}
然后,在
parseQuestionType
方法中,只需使用:

私有静态QuestionType解析QuestionType(QuestionTypeInfo QuestionTypeInfo){
返回questionTypeInfo.getQuestionType();
}

如果您可以保证这些类型是唯一存在的类型,并且不存在其他子类,那么您可以创建具有以下签名的映射:

Map<Class<? extends QuestionTypeInfo>, QuestionType> mapping;
然后,您可以执行如下简单查找:

mapping.put(MatrixSinglePerRowQuestionTypeInfo.class, QuestionType.MATRIX_SINGLE_PER_ROW);
return mapping.get(questionTypeInfo.getClass());
尽管这仅在MatrixSinglePerRowQuestionTypeInfo
是一个没有附加子类的类时才起作用。由于
Map
在内部使用
equals
方法检查给定的密钥是否存在。请看这个简化的示例,它将破坏我提出的逻辑(,但将与您现有的逻辑一起工作!!):


使用hasMap?一个枚举作为键,另一个作为值?这是1:1映射吗?至少使用
开关大小写
使用
instanceof
是一种代码味道。大多数情况下,最好有一个不同类具体实现的方法。(参见Ondra的回答)如果基本接口的重构是可能的,那么这就是解决方法,其他任何解决方案都会破坏OOP,因为需要了解基本接口的每一个子类型。这样,实现类必须自行决定它是什么
QuestionType
+1.
// create a subclass
class SomeSubClass extends MatrixSinglePerRowQuestionTypeInfo { ... }

// initialize the mapping
mapping.put(MatrixSinglePerRowQuestionTypeInfo.class, Foo.BAR);

// in your lookup
mapping.get(MatrixSinglePerRowQuestionTypeInfo.class); // returns Foo.BAR as expected
mapping.get(SomeSubClass.class); // returns null??