Java 当创建具有不同值的对象时,如何避免很多if-else-if条件

Java 当创建具有不同值的对象时,如何避免很多if-else-if条件,java,enums,refactoring,Java,Enums,Refactoring,我有四个不同的枚举UserOneStatus、UserTwoStatus、UserThreeType和UserFourType,它们有ID和名称 我必须根据这些枚举ID筛选用户,因此,我最终得到以下代码 if (ChoosenUserFilterValue.equals(String.valueOf(UserOneStatus.REQUESTED.getId()))) { selecedUserFilter = new UserFilter(UserOneStatus.c

我有四个不同的枚举UserOneStatus、UserTwoStatus、UserThreeType和UserFourType,它们有ID和名称

我必须根据这些枚举ID筛选用户,因此,我最终得到以下代码

if (ChoosenUserFilterValue.equals(String.valueOf(UserOneStatus.REQUESTED.getId()))) {
            selecedUserFilter = new UserFilter(UserOneStatus.class,
                    String.valueOf(UserOneStatus.REQUESTED.getId()),
                    UserOneStatus.REQUESTED.getUserStatus(), String.valueOf(UUID.randomUUID()));
        } else if (ChoosenUserFilterValue.equals(UserOneStatus.ACTIVE.getId() + "")) {
            selecedUserFilter = new UserFilter(UserOneStatus.class,
                    String.valueOf(UserOneStatus.ACTIVE.getId()),
                    UserOneStatus.ACTIVE.getUserStatus(), String.valueOf(UUID.randomUUID()));
        } else if (ChoosenUserFilterValue.equals(UserOneStatus.INACTIVE.getId() + "")) {
            selecedUserFilter = new UserFilter(UserOneStatus.class,
                    String.valueOf(UserOneStatus.INACTIVE.getId()),
                    UserOneStatus.INACTIVE.getUserStatus(), String.valueOf(UUID.randomUUID()));
        } else if (ChoosenUserFilterValue.equals(UserTwoStatus.REVOKED.getId() + "")) {
            selecedUserFilter = new UserFilter(UserTwoStatus.class,
                    String.valueOf(UserTwoStatus.REVOKED.getId()),
                    UserTwoStatus.REVOKED.getLoginStatus(), String.valueOf(UUID.randomUUID()));
        } else if (ChoosenUserFilterValue.equals(UserThreeType .ADMIN.getId() + "")) {
            selecedUserFilter = new UserFilter(Some.class,
                    String.valueOf(UserThreeType.ADMIN.getId()),
                    UserThreeType.ADMIN.getName(), String.valueOf(UUID.randomUUID()));
        } else if (ChoosenUserFilterValue.equals(UserFourType .SSO_TEMPLATE.getId() + "")) {
            selecedUserFilter = new UserFilter(Some.class,
                    String.valueOf(UserFourType.SSO_TEMPLATE.getId()),
                    UserFourType.TEMPLATE.getName(), String.valueOf(UUID.randomUUID()));
        }
我对它进行了一点重构,但无法得到与上面代码相同的结果

重构后的代码如下

Map<String,Class<?>> map = new HashMap<String, Class<?>>();
map.put(UserOneStatus.REQUESTED.getId()+"", UserOneStatus.class);
map.put(UserOneStatus.ACTIVE.getId()+"", UserOneStatus.class);
map.put(UserOneStatus.INACTIVE.getId()+"", UserOneStatus.class);
map.put(UserTwoStatus.REVOKED.getId()+"", UserTwoStatus.class);
map.put(UserThreeType.ADMIN.getId()+"", Some.class);
map.put(UserFourType.TEMPLATE.getId()+"", Some.class);

String key ="";

if(map.containsKey(ChoosenUserFilterValue)){
    Class<?> getSelectedUserFilterValueClass = map.get(selectedUserFilterValue);

     for (Entry<String, Class<?>> entry : map.entrySet()) {
                key = entry.getKey();
        }

    selecedUserFilter = new UserFilter(getSelectedUserFilterValueClass, key , getSelectedUserFilterValueClass.toString(), String.valueOf(UUID.randomUUID());
}
Map>();
map.put(UserOneStatus.REQUESTED.getId()+“”,UserOneStatus.class);
map.put(UserOneStatus.ACTIVE.getId()+“”,UserOneStatus.class);
map.put(UserOneStatus.INACTIVE.getId()+“”,UserOneStatus.class);
map.put(UserTwoStatus.reversed.getId()+“”,UserTwoStatus.class);
map.put(UserThreeType.ADMIN.getId()+“”,Some.class);
map.put(UserFourType.TEMPLATE.getId()+“”,Some.class);
字符串键=”;
if(map.containsKey(选择UserFilterValue)){
类getSelectedUserFilterValueClass=map.get(selectedUserFilterValue);

对于(条目基于某种输入数据(如ID、数字等)创建一个接口/抽象类的对象的问题)应该使用工厂方法设计模式或抽象工厂模式来解决。您的代码是一种工厂方法,在这种情况下使用if/else语句非常好。在这里,您可以查看和的示例。

您为什么不能在这里使用
switch
语句?多态性、状态机…这些这是需要研究的问题。仅仅重构不会带来显著的改进。@GhostCat我考虑过状态机,但它不处理事件和状态转移,如果我遗漏了什么,请告诉我。它只是检查值并根据值创建新的UserFilter对象。@Makoto
switch
works但是我很难写一个测试用例并涵盖所有的分支。谢谢你的回复,你想避免这些条件吗?我想用一些更清晰易懂但条件数量相同的东西。