@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
在java8之前这么分开写是最优的,为了降低程序计算量,避免(T) clazz.newInstance()每次都执行,这也是java不支持函数式惰性求值的弊端.
在java8 之后 可以通过computeIfAbsent方法来解决,你可以去了解下java8的computeIfAbsent方法,了解后,这个问题就很清楚了。
java8之后可以这么写:
EXTENSION_INSTANCES.computeIfAbsent(clazz, clazz -> (T) clazz.newInstance());
原回答者GitHub用户wuwen5
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。