前言
内部类在学习基础Java知识的时候大部分人都了解过,但也是大部分人都只是了解而已,在长年累月的开发中你才会发现内部类的真正好处
定义
可以将一个类定义在另一个类的内部,这就是内部类。内部类是一种非常有用的的特征,因为它允许你把一些逻辑相关的数据组织在一起,并控制内部类的可视性。
- 静态内部类:静态内部类除了访问权限修饰符比外围类多以外, 和外围类没有区别, 只是代码上将静态内部类组织在了外部类里面
- 非静态内部类:创建该类的前提是外部类实例已经被创建好了,而内部类可以访问外部类的实例变量,也就可以做到了一个外部类实例私有成员被其他多个内部类实例访问。
场景
- 利用内部类实现多重继承
- 利用多实例内部类共享外部类实例成员特性:迭代器模式
实践
背景:系统是一个基于流程作出决策的状态机系统,有一个流程对象,而每一个流程节点都是一个状态模式中的状态;因为流程是通过配置出来的,所以流程节点具有配置好的实例和状态。现在要求不同的用户请求可以执行相同的流程。
public class Workflow{ public Node root }
问题:同一个流程节点,不同的用户执行,就会对每一个用户产生不同的流程节点状态。也就是单例的流程节点本身对用户而言的无状态的,但确确实实在用户使用的时候会产生状态值,那么该如何放置这些状态呢?
public class Node{ ...... Link link; //图的邻接表表示法 ...... Map config = new HashMap(); }
方案:我们现在参考一件事:jvm中,方法本身也是对每一次执行无状态的,放置在方法区中;但是每一次执行方法都会创建一个方法帧,压进线程栈中。是不是和流程的执行很相似?所以我为每一次流程节点的执行,都创建一个流程的执行帧对象,这多个用户执行同一个节点的时候,只需创建该执行帧就行了,因为执行帧能拿到节点的私有引用,包括节点的配置。所以这个执行帧是放置用户执行状态最好的地方。
public class Node{ private Map config = new HashMap(); public ExecuteFrame{ Map exeConfig = new HashMap(); public void doExecute(){ Service.doAction(config.putAll(exeConfig)) } } }
完整的代码如下:
public class Node{ private Map config = new HashMap(); //利用上下文,创建一个节点的执行空间 public ExecuteFrame newFrame(Context context){ ..... return new ExecuteFrame(context); } public class ExecuteFrame{ Context context public ExecuteFrame(Context context){ this.context = context; } Map exeConfig = new HashMap(); public void doExecute(Context context){ Service.doAction(config.putAll(exeConfig)) ...... } } }
最后我还创建了一个执行器对象,用在管理不同流程的执行帧,这样又可以跟着用户的执行路径,这个设计我非常满意。
原文地址:https://www.cnblogs.com/iCanhua/p/11372287.html
时间: 2024-10-29 22:09:51