`

Java匿名内部类的传值

    博客分类:
  • Java
阅读更多
在Nutz中,存在大量需要使用匿名内部类的情况,很多童鞋都对传值很困惑,所以我这里说明一下

传入:

//匿名内部类,只能访问final的本地变量及方法参数
public void addUser(final String name, String passwd, final String userType) {
    User user = null;
    if ("admin".equal(userType))
        user = new AdminUser(name, passwd); //仅作演示.
    else
        user = new User(name, passwd);
    final User _user = user; //因为user变量不能设置为final,所以需要新加一个变量来中转
    Trans.run(new Atom(){
        public void run() {
            dao.insert(_user);
            if (log.isDebugEnable())
                log.debugf("Add user id=%d, name=%s , type=%s", _user.getId(), name, userType);
        }
    });
}

传出(获取方法返回值等等):

方法1 – 对象数组法 通过一个final的Object对象数组,存放需要的值

public long countUser(final String userType) {
    final Object[] objs = new Object[1];
    Trans.run(new Atom(){
        public void run() {
            objs[0] = dao.count(User.class, Cnd.where('userType', '=', userType));
        }
    });
    return ((Number)objs[0]).longValue();
}
方法2 – ThreadLocal法 通过一个ThreadLocal来存放结果,这个ThreadLocal可以是静态的,供全app使用的

private static final ThreadLocal re = new ThreadLocal(); //自行补上泛型Object
public long countUser(final String userType) {
    Trans.run(new Atom(){
        public void run() {
            re.set(dao.count(User.class, Cnd.where('userType', '=', userType)));
        }
    });
    return ((Number)re.get()).longValue(); //严谨一点的话,应该将ThreadLocal置空
}
方法3 – Molecule法 Molecule类是Nutz内置的抽象类类,实现Runnable和Atom接口,添加了两个获取/设置值的方法.

public long countUser(final String userType) {
    Molecule mole = new Molecule() { //需要自行补齐泛型
        public void run() {
            setObj(dao.count(User.class, Cnd.where('userType', '=', userType)));
        }
    };
    Trans.run(mole);
    return ((Number)mole.getObj()).longValue();
}


http://wendal.net/404.html
分享到:
评论

相关推荐

    Java开发技术大全(500个源代码).

    anonymousInner.java 匿名内部类 base.java 定义一个基类 BaseColors.java 一个简单的接口 basePoint.java 一个测试用的基类 Colorable.java 一个子接口 ColoredPoint.java 一个测试用子类 common.java 一个...

    Java2实用教程.rar

    4 15 1和类有关的匿名类 4 15 2和接口有关的匿名类 4 16异常类 4 16 1try catch语句 4 16 2自定义异常类 4 17Class类 4 17 1获取类的有关信息 4 17 2使用Class实例化一个对象 4 18基本类型的类包装 4 18 1Double类和...

    面向对象经典讲解 有助于更进一步理解java对象

    - 内部类是定义在一个类内部的类,可以是成员内部类、局部内部类、匿名内部类等,提供了更复杂的封装和抽象能力。 **JAVA中的文档注释**: - 使用`/** ... */`格式的注释可以生成Javadoc,这是一种自动生成API文档...

    java基础复习

    ### Java基础复习知识点详解 #### 一、Java语言特点 - **高级编程语言**:Java是一种面向对象的高级编程语言,... - 匿名内部类 以上是关于Java基础复习的知识点详解,对于理解Java的核心概念和编程实践非常重要。

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    7.2.2 匿名内部类 217 7.2.3 使用enum枚举常数 221 7.3 重点复习 224 7.4 课后练习 224 chapter8 异常处理 231 8.1 语法与继承架构 232 8.1.1 使用try、catch 232 8.1.2 异常继承架构 235 8.1.3 要...

    Java方法学习实例收集

    9. **匿名内部类与局部类** - 在方法内部定义的类,无需命名,常用于事件处理和接口实现。 10. **Lambda表达式** - Java 8引入的新特性,简化了函数式接口的实现,使代码更简洁。 通过“Java方法学习实例收集”...

    java资料面试题

    #### 2.20 “+”操作符在 Java 内部是如何实现字符串连接的? 在 Java 中,字符串连接使用 `+` 操作符时,实际上是创建了一个新的 `StringBuilder` 对象来进行拼接,最后转换成 `String` 返回。 #### 2.21 == 和 ...

    Java进阶路线

    Java支持四种类型的内部类: - **私有类**:定义在另一个类内部,不能被外部访问。 - **嵌套类**:在类的外部定义,但没有访问修饰符。 - **局部类**:定义在方法中,只能在该方法内部使用。 - **匿名类**:没有...

    自己总结的java笔记

    - 匿名内部类 #### 集合 - **概念**:集合是一系列对象的容器,提供了添加、删除、查找等功能。 - **主要类型**: - `List`:有序的集合,允许重复元素。 - `Set`:不允许重复元素的集合。 - `Map`:存储键值...

    java面试陷阱集合

    2. **Anonymous Inner Class**:匿名内部类可以继承其他类,也可以实现接口,但它们没有名字,通常用于简洁地实现回调或适配器模式。 3. **Static Nested Class 和 Inner Class**:静态嵌套类(static nested class...

    java初级概念-完整版

    - Java采用传值方式,基本类型传递值,引用类型传递对象引用,但不能改变引用本身。 `static` 关键字: - 用于声明静态变量、静态方法和静态代码块,它们属于类而非对象,可以直接通过类名访问。 静态方法的注意...

    Java计算机语言函数应用

    - 传值调用(Pass by Value)是Java默认的参数传递方式,意味着函数内部无法改变实参的原始值。 3. **返回值** - 函数可以有返回值,也可以没有。如果函数有返回值,需要指定返回类型。没有返回值的函数使用`void...

    java程序设计实验指导

    3. **建立独立运行的窗口界面并使用匿名类:** 如使用JFrame和JButton等Swing组件。 4. **使用Swing组件:** 如JButton、JTextField等。 5. **使用自定义对话框与内部类:** 如使用JOptionPane显示消息框。 **实验...

    2016奇虎360 JAVA研发工程师内推笔试题及答案.pdf

    在这个例子中,`o.equals("Fred")` 会返回 `true`,因为 `o` 实际上是匿名内部类的一个实例,它的 `equals()` 总是返回 `true`。 9. **Java 数据类型与运算**: Java 中的字节变量 (`byte`) 只能容纳 -128 到 127 ...

    SimpleJava.pdf

    - **匿名内部类**:没有名称的内部类,常用于实现接口或抽象类。 #### 18. Java中的内部接口是什么? - **内部接口**:定义在另一个类内部的接口。 - **应用场景**:主要用于限制接口的可见范围,通常不对外公开。...

    Activity与AlertDialog值传递

    这一步在使用匿名内部类时是必需的,因为`OnClickListener`的`context`参数是`Context`类型,而不是具体的`Activity`类型。 总结一下,Android中的`Activity`和`AlertDialog`值传递主要通过创建`AlertDialog`,设置...

    method_program

    12. **匿名内部类与Lambda表达式**:在Java 8及以上版本中,可以使用lambda表达式简化方法的定义,特别是对于无状态、单方法的接口。 从压缩包文件名"method_program-master"来看,这可能是一个Git仓库的主分支,...

    python面试题

    在Python中,函数参数的传递遵循“传值”而非“传引用”的原则。当传递不可变数据类型(如整数、字符串等)时,实际上是将该数据类型的值复制一份传递给函数;而对于可变数据类型(如列表、字典等),则是将该对象的...

    Android基础学习(4大组件,动画,Webservice,ListView,XML,线程)

    - 使用匿名内部类实现点击事件处理逻辑。 4. **启动与关闭Activity** - 启动Activity: `Intent i = new Intent(Context.class, TargetActivity.class); startActivity(i);` - 关闭Activity: `finish();`,若需...

Global site tag (gtag.js) - Google Analytics