Java 平台与 OpenJDK
让我们从 Java 虚拟机开始。
下面是一个优化后的结果示例:
static factory_method.Car produce(java.lang.String);
descriptor: (Ljava/lang/String;)Lfactory_method/Car;
flags: (0x0008) ACC_STATIC
Code:
stack=7, locals=5, args_size=1
0: new #7 // class factory_method/FactoryMethodEvent
3: dup
...
19: aload_3
20: invokevirtual #17 // Method java/lang/String.hashCode:()I
23: lookupswitch { // 2
3135580: 48
3556498: 63
default: 75
}
48: aload_3
49: ldc #23 // String fast
51: invokevirtual #25 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
用 SOLID 思想看设计模式
概述 SOLID 原则以及与现在开发需要考虑的一些设计原则:
设计模式分创建型、结构型、行为型,其中行为型设计模式需要考虑服务、运行时的并发。
一些重要项目
简化创建对象
JDK 中使用 Builder:使用 StringBuilder 或者像下面这样:
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 s
when 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();
}
运行时设置行为
运行时如何维护对象之间的信息传递?
由 JVM 和代码库提供灵活性和可维护性。
JDK 中的责任链:
public class Logger {
public void log(Level level, Supplier < String > msgSupplier)
//overloaded method, Levels: OFF, SEVERE, WARNING ...
JDK 中的命令:
java.lang.Runnable, java.lang.Callable
JDK 中的缓存:
java.util.Locale
private static class Cache extends LocaleObjectCache < Object, Locale > {
private static final Cache LOCALECACHE = new Cache();
并发相关
那么并行执行的代码该如何考虑呢?
根据问题的多线程性质选择适合的设计模式组合。
下图中可以看到并发相关 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 -