开发者社区 > 云原生 > 正文

这种写法都是为了啥? 为什么不通过putlfabsent时直接获取呢

@SuppressWarnings("unchecked") private T createExtension(String name) { Class<?> clazz = getExtensionClasses().get(name); if (clazz == null) { throw findException(name); } try { T instance = (T) EXTENSION_INSTANCES.get(clazz); if (instance == null) { // ************************************************************ // EXTENSION_INSTANCES.putIfAbsent(clazz, (T) clazz.newInstance()); instance = (T) EXTENSION_INSTANCES.get(clazz); // ************************************************************ // } injectExtension(instance); Set<Class<?>> wrapperClasses = cachedWrapperClasses; if (wrapperClasses != null && wrapperClasses.size() > 0) { for (Class<?> wrapperClass : wrapperClasses) { instance = injectExtension((T) wrapperClass.getConstructor(type).newInstance(instance)); } } return instance; } catch (Throwable t) { throw new IllegalStateException("Extension instance(name: " + name + ", class: " + type + ") could not be instantiated: " + t.getMessage(), t); } }

EXTENSION_INSTANCES.putIfAbsent(clazz, (T) clazz.newInstance()); instance = (T) EXTENSION_INSTANCES.get(clazz);

这句话为什么总分开写呢,我发现里面有很多这种写法,为什么不通过这种呢

instance = EXTENSION_INSTANCES.putIfAbsent(clazz, (T) clazz.newInstance());

原提问者GitHub用户debugmoney

展开
收起
大圣东游 2023-05-11 20:36:47 174 0
1 条回答
写回答
取消 提交回答
  • 在java8之前这么分开写是最优的,为了降低程序计算量,避免(T) clazz.newInstance()每次都执行,这也是java不支持函数式惰性求值的弊端.

    在java8 之后 可以通过computeIfAbsent方法来解决,你可以去了解下java8的computeIfAbsent方法,了解后,这个问题就很清楚了。

    java8之后可以这么写:

    EXTENSION_INSTANCES.computeIfAbsent(clazz, clazz -> (T) clazz.newInstance());

    原回答者GitHub用户wuwen5

    2023-05-12 12:01:39
    赞同 展开评论 打赏
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载