【Java内部类】用法总结

前言

  内部类在学习基础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

【Java内部类】用法总结的相关文章

[转] Java内部类详解

作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就来一探究竟.下面是本文的目录大纲: 一.内部类基础 二.

Java内部类详解 2

Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就来一探究竟.下面是本文的目录大纲: 一.内部类基础 二.深入理解内部类 三.内部类的使用场景和好处 四.常见的与内部类相关的笔试面试题 若有不正之处,请多谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3811

java 内部类复习

1 /** 2 * 内部类详解 3 * 4 * @author shao 5 * 6 */ 7 public class InnerClass { 8 9 public static void main(String[] args) { 10 Man p = new Man("丽丽"); 11 Man.Son son = p.new Son("小丽丽"); 12 son.play(); 13 Man.Girl girl = new Man.Girl(); 14 gi

我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行

习惯了在IDE工具上进行代码编写,连最基本的Javac命令和Java命令都忘记的差不多了,今天对一个Java内部类进行编译和运行的时候,就出糗了.IDE是把双刃剑,它可以什么都帮你做了,你只要敲几行代码,点几下鼠标,程序就跑起来了,用起来相当方便.你不用去关心它后面做了些什么,执行了哪些命令,基于什么原理.然而也是这种过分的依赖往往让人散失了最基本的技能,当到了一个没有IDE的地方,你便觉得无从下手,给你个代码都不知道怎么去跑. 首先我在C盘上编写了一个InnerClassTest.java代码

简单谈一谈Java内部类的使用原因

使用内部类的原因 学习总得知其所以然,前面的一篇文章中我有提到过关于java内部类的几种用法以及一些示例,但是不明白内部类具体可以做什么,显然学习起来很渺茫,今天的文章简单说一说使用内部类的几个原因,为了可读性更好,示例都极大的简化了,希望能给初学者一些帮助 (一) 封装性 作为一个类的编写者,我们很显然需要对这个类的使用访问者的访问权限做出一定的限制,我们需要将一些我们不愿意让别人看到的操作隐藏起来, 如果我们的内部类不想轻易被任何人访问,可以选择使用private修饰内部类,这样我们就无法通

Java内部类

本文是<Java核心技术 卷1>中第六章接口与内部类中关于内部类的阅读总结. Java中的内部类(inner class)是定义在另一个类内部的类.那么内部类有什么用呢?这里主要由三个内部类存在的原因: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据.即,如果类A中定义了类B,那么类B可以访问类A中的数据,甚至是私有数据,但类A不能访问类B中的私有数据: 内部类可以对同一个包中的其他类隐藏起来.在一个包中,定义一个类时,即使不加上访问权限关键词,这个类也是包内其他类可访问的,不

Java内部类:局部内部类(三)

Java内部类分为4个部分进行阐述,分别为概览.成员内部类.局部内部类和匿名内部类. 在本文中是Java内部类的局部内部类,主要讲局部内部类的概念和在使用局部内部的过程中,需要注意的一个细节. 1.局部内部类的概念 在一个类的方法内部定义另外一个类,那么另外一个类就称作为局部内部类. class OutterClass { void test() { class InnerClass//局部内部类 { } } } 在上述代码中,InnerClass定义在OutterClass的test方法的内部

Java内部类:匿名内部类(四)

Java内部类分为4个部分进行阐述,分别为概览.成员内部类.局部内部类和匿名内部类. 在本文中是Java内部类的匿名内部类,主要讲述匿名内部类的概念.匿名内部类的好处.匿名内部类的使用前提.和匿名内部类的应用场景. 1.匿名内部类的概念 没有类名的类就称作为匿名内部类 2.匿名内部类的好处 简化书写 3.匿名内部类的使用前提 必须存在继承或者实现关系才能使用 4.匿名内部类的应用场景 匿名内部类一般是用于实参 示例代码: package com.rk.innerclass; public cla

Java内部类小程序(成员内部类,静态内部类,匿名内部类)

1 /** 2 * 测试java内部类(成员内部类,静态内部类,匿名内部类) 3 * 局部内部类不常用,就不写了. 4 * @package :java05 5 * @author shaobn 6 * @Describe : 7 * @Time: 2015-9-6 下午8:32:38 8 */ 9 public class TestInner { 10 11 /** 12 * @author shaobn 13 * @Describe : 14 * @param args 15 * @Time

Java RMI 用法总结

RMI就是远程方法调用的简写.顾名思义,就是让一台机器上的对象调用另外一个机器上的对象.RMI的用法非常简单,首先是服务端定义一个接口(接口要扩展Remote接口),再实现这个接口(要扩展UnicastRemoteObject),再绑定到Naming静态类中.客户端通过Naming获取一个远程对象,就可以像普通的对象一样调用远程对象了.RMI中有个Stub类,它的作用就是代理服务器的接口对象,负责将方法的调用转换成网络请求发送给服务器,再从服务器返回对象进行解码.在JDK1.5中,Stub类会自