简体   繁体   中英

How to avoid a lot of if else if conditions when there is creation of object with different values

I have a Four different enum UserOneStatus, UserTwoStatus, UserThreeType and UserFourType which has ID and Name

I have to filter the User based on the those Enum ID's so, I end up with the following code

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()));
        }

I refactored It little bit but I could't able to get the results as same as the upper code

The refactored code is as follows

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());
}

any suggestions are appreciated

Thanks

Problems of creating objects of one interface/abstract class, based on some kind of input data (like ids, numbers, etc.) are supposed to be solved using factory method design pattern, or abstract factory pattern. Your code is a kind of factory method, and using if/else statements are perfectly fine in such situations. Here you can check an example of factory method , and abstract factory .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM