(给ImportNew加星标,提高Java技能)
下面是一个优化后的结果示例:
static factory_method.Car produce(java.lang.String);descriptor: (Ljava/lang/String;)Lfactory_method/Car;flags: (0x0008) ACC_STATICCode:stack=7, locals=5, args_size=10: new #7 // class factory_method/FactoryMethodEvent3: dup...19: aload_320: invokevirtual #17 // Method java/lang/String.hashCode:()I23: lookupswitch { // 23135580: 483556498: 63default: 75}48: aload_349: ldc #23 // String fast51: invokevirtual #25 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
用 SOLID 思想看设计模式
概述 SOLID 原则以及与现在开发需要考虑的一些设计原则:
SOLID 原则:单一功能、开闭原则、里氏替换、接口隔离以及依赖反转;
不要重复自己,关注点分离,CAP 原则;
编程语言和技术不可知;
微服务架构、分布式系统领域驱动设计、数据流;
可扩展性、可维护性与安全性。
public class Thread implements Runnable { //JDK19(Preview)public sealed interface Builder permits Builder.OfPlatform,Builder.OfVirtual, ThreadBuilders.BaseThreadBuilder {..}}
JDK 中的工厂:使用 Java Collection framework,例如 List、Set 或者 Map。
static <E> List <E> of (E e1, E e2, E e3) {return ImmutableCollections.listFromTrustedArray(e1, e2, e3);}static <K, V> Map <K, V> of (K k1, V v) {return new ImmutableCollections.Map1 < > (k1, v1);}
下面是 CarFactory 示例及运行效果:
record FastCar(String type) implements Car { ...sealed interface Factory permits CarFactory { ...final class CarFactory {static Vehicle produce(String type) {var result =switch (type) {case "fast" - > {...yield new FastCar(“super”);}case String swhen s.length() > 10 - > new SlowCar()...
如何结构化思考
如何围绕实例化对象组织代码(指令)
备选方案:适配器或享元模式;
其它方案:组合模式、装饰器模式、外观模式(也称门面模式)、过滤器模式、模块模式、控制器模式、标记型接口、代理模式、双胞胎模式。
JDK 中的适配器:
public final class Spliterators { ...public static <T> Iterator <T> iterator(Spliterator <<?extends T> spliterator) {Objects.requireNonNull(spliterator);class Adapter implements Iterator <T> , Consumer <T> {...}}}public Collections {...public static <T> ArrayList <T> list(Enumeration <T> e) { ... }
JDK 中的友元:
Integer、Byte、Character 等包装类,以及 valueOf(...) 方法使用到的缓存:
return IntegerCache.cache[i + (-IntegerCache.low)];下面是 Engine 密封接口示例及运行效果:
var engine = counter++ % 2 == 0 ? new DieselEngine() : new ElectricEngine();var fastCar = new FastCar(engine);class FastCar {...FastCar(Engine engine) {...}public void drive() {...if (engine instanceof ElectricEngine ee) {ee.checkBatteries();}engine.run();...sealed interface Engine {void run();}
public class Logger {public void log(Level level, Supplier < String > msgSupplier)//overloaded method, Levels: OFF, SEVERE, WARNING ...
JDK 中的命令:
java.lang.Runnable, java.lang.CallableJDK 中的缓存:
java.util.Localeprivate static class Cache extends LocaleObjectCache < Object, Locale > {private static final Cache LOCALECACHE = new Cache();
并发相关
那么并行执行的代码该如何考虑呢?
根据问题的多线程性质选择适合的设计模式组合。
备选方案:线程池模式;
其它方案:主动对象模式、异步方法调用、Balking 模式、双重检查锁定、读写锁、调度器等。
下图中可以看到并发相关 package 在 JDK 中的依赖关系(由 Java Mission Control 8.3 生成)
下面是一个使用虚拟线程的示例:
var threadPerTaskExecutor = Executors.newThreadPerTaskExecutor(threadFactory);var executor = Executors.newVirtualThreadPerTaskExecutor();threadPerTaskExecutor.execute(() - > {while (active.get()) {executor.submit(new ComputableTask(counter));}})
总结
设计模式和 JDK 新功能带来了以下好处:
转自:Miroslav Wengner 与 Benedikt Neumayr,
链接:slideshare.net/miragemiko/new-java-features-simplified-design-patternslit3826
- EOF -
看完本文有收获?请转发分享给更多人
关注「ImportNew」,提升Java技能
点赞和在看就是最大的支持❤️