还是关于if else if else优化问题?

还是关于if else if else优化问题?
下面这段代码,因为针对不同的版本,要才有不同的处理逻辑。如果以后再有版本还是再里面建判断,但是感觉这个也不太适合用策略模式,因为逻辑太少了,希望大家帮忙看一下,xiexie
下面是代码入口

private String createNccSign(String version,String appPubKey,String appSecret){
    if(NcVersionEnum.NC_VERSION_2005.getVersion().equals(version)){
      return SHA256Util.getSHA256(CLIENT_ID + CLIENT_SECRET + PUBKEY);
    }else if(NcVersionEnum.NC_VERSION_2105.getVersion().equals(version) ||
            NcVersionEnum.NC_VERSION_2111.getVersion().equals(version)){
      return SHA256Util.getSHA256(CLIENT_ID + CLIENT_SECRET + PUBKEY, PUBKEY);
    }else if(NcVersionEnum.NC_VERSION_2207.getVersion().equals(version)){
      return SHA256Util.getSHA256(CLIENT_ID + appSecret + appPubKey, appPubKey);
    }
    return "";
  }

这是是定义的枚举类:

public enum NcVersionEnum {
    NC_VERSION_2005("ncc_2005_native"),
    NC_VERSION_2105("ncc_2105_native"),
    NC_VERSION_2111("ncc_2111_native"),
    NC_VERSION_2207("ncc_202207"),

    DEFAULT_ERP_VERSION("NC");

    private static final List<NcVersionEnum> ncVersionEnums = new ArrayList<>();

    static {
        ncVersionEnums.add(NC_VERSION_2005);
        ncVersionEnums.add(NC_VERSION_2105);
        ncVersionEnums.add(NC_VERSION_2111);
        ncVersionEnums.add(NC_VERSION_2207);
    }


    private String version;

    NcVersionEnum( String version) {
        this.version = version;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
    }

    /**
     * 根据版本得到对应的枚举类。
     * @param version 版本
     * @return 对应的枚举类,如果没有返回默认版本
     */
    public static NcVersionEnum getByVersion(String version) {
        for (NcVersionEnum versionEnum : NcVersionEnum.values()) {
            if (versionEnum.getVersion().equals(version)) {
                return versionEnum;
            }
        }
        return DEFAULT_ERP_VERSION;
    }

    /**
     * 根据枚举类的版本得到是否需要走
     * @param ncVersionEnum
     * @return
     */
    public static boolean isNCCVersion(NcVersionEnum ncVersionEnum){
        return ncVersionEnums.contains(ncVersionEnum);
    }
}

下面是根据判断分别要走的加密

public static String getSHA256(String str, String key) {
        //加盐
        byte[] salt = new byte[16];
        try {
            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
            random.setSeed(key.getBytes());
            random.nextBytes(salt);
        } catch (NoSuchAlgorithmException ignore) {
            //加密算法固定,不会抛出该异常
        }
        String saltValue = Base64Util.encryptBASE64(salt);
        return getSHA256(str + saltValue.replaceAll("[\r\n]", ""));
    }

    public static String  getSHA256(String str) {
        MessageDigest messageDigest;
        String encodestr = "";
        try {
            messageDigest = MessageDigest.getInstance("SHA-256");
            messageDigest.update(str.getBytes(StandardCharsets.UTF_8));
            encodestr = byte2Hex(messageDigest.digest());
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
        return encodestr;
    }

一般这种情况应该怎么优化,万一以后再加个版本啥的。
备注:这种大写的都是写死的CLIENT_ID
这种小写 appSecret的都是传进来的,针对不同的版本有的要传进来,有的写死的。

个人觉得switch和if else没有区别,没啥大必要去转换。我觉得可以用反射去做,根据你第一段代码,把NcVersionEnum写到配置文件里,然后用properties类型,每个类型对应一个解决方法的类全路径(这些类的方法名和参数需要一致),然后代码里你只需要匹配这个值去拿到类路径,反射出来去执行那个方法就可以了,然后问题是这个方法的参数要统一getSHA256()这个方法,参数你可以包成一个对象,所有可能的值,都set进去,只需要在处理的类里面去判断就行。这样的话,有新的来的话,你只需要新增一个解决类(如果解决方法相同可以服用),然后配置文件加一个对应关系就可以了

关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:优化if else

枚举里面加个方法,每个枚举值来重写,

不能用switch么?

https://www.jb51.net/article/216254.htm

策略模式的枚举

可以采用注解的方式,解决这个问题,
参考文章:https://tanyongpeng.blog.csdn.net/article/details/122723134?spm=1001.2014.3001.5502