0 0

java new一个新的类后面接{}有什么用途?5

像下面这段代码,ThreadLocal在初始化的时候后面接了一个方法,我在自己的代码中也试了一下,可以再大括号中定义变量定义方法,但是外部是不能调用的,我想知道这样写除了初始化还有什么用途和意义呢?
private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>(){  
        public Integer initialValue(){  
            return 0;  
        }  
    };  
 
2013年1月04日 10:56

7个答案 按时间排序 按投票排序

0 0

采纳的答案

匿名内部类。你通过这种写法从ThreadLocal继承了一个匿名的子类,在这个子类中覆盖了ThreadLocal的initialValue方法,同时创建了这个子类的一个实例(因为这个子类是匿名的,你无法在后续的代码里引用,所以必须在定义时同时创建实例)。

它的作用跟

class OutterClass {

    private static class MyThreadLocal extends ThreadLocal<Integer> {
        public Integer initialValue(){    
            return 0;    
        }   
    }

    private static MyThreadLocal seqNum = new MyThreadLocal();
}


等价,好处是你不用专门为这个子类(MyThreadLocal)想一个名字,代码量也少一点。

2013年1月04日 14:25
0 0

类的装载需要消耗系统资源,当你在开发移动应用时,一个按钮的点击事件只在这个按钮所在的页面中这个按钮被点击时才会被调用,所以一般用在比较私有的、用来实现继承方法比如listener的时候,会使用匿名内部类。

2013年1月08日 14:07
0 0

给你个实例来看下好处, 比如 我们处理业务请求的时候, 都是需要事物来控制提交和回滚的, 是不是每次都需要重复的写 try catch 来begin和commit 或者rollback呢

定义一个你需要的接口来规范行为: 无需对它做实现类.

public interface TransactionAction {
  void execute(ActionEvent event) throws Exception;
}


定义这个规范, 也就是成功提交 失败回滚
public void transactionProcess(TransactionAction action, ActionEvent event)
      throws Exception {
    UserTransaction ut = null;
    try {
      ut = Trans.getUserTransaction();
      ut.begin();
      action.execute(event);
      ut.commit();
    } catch (Exception ex) {
      StringWriter aWriter = new StringWriter();
      ex.printStackTrace(new PrintWriter(aWriter));
      Log.error(this.getClass(), aWriter.toString());
      try {
        ut.rollback();
      } catch (Exception e) {
        throw new SysException(DAOErrorType.DAO_ROLLBACK_ERROR, e);
      }

      if (ex instanceof NoMessageAppException) {
        return;
      }

      if (ex instanceof PopupAppException || ex instanceof AppException) {
        throw ex;
      }
      AppException appException = new AppException(-1, ex);
      if (null != ex.getMessage()) {
        appException.setLocalizedErrorMessage(ex.getMessage());
      } else {
        appException.setLocalizedErrorMessage(StringResource.getStringData(
            "MSG_GS_SP_02143", JSFHelper.getRequest()));
      }
      throw appException;
    }
  }



业务中使用:
 public void next(ActionEvent event) throws Exception {
    helper.transactionProcess(new TransactionAction() {
      public void execute(ActionEvent event) throws Exception {
          //这时候你只需要关注你的业务了, 不需要管事物了.
    }
  }
}



ActionEvent: 这个参数就是你业务对象了, 如一般BaseFormBean.

2013年1月04日 14:24
0 0

你这个例子的public的确没有任何的意义,一般如果你定义了内部的全局变量只是提供给这个内部类能用,一般我们这么写是为了重写某个接口,或者重载某个方法。

楼上的回答都没有搞清楚提问者到底想问什么。

2013年1月04日 14:11
0 0

这样写最大的好处是简洁,难道让我重新建一个java文件叫ThreadLocal.java?
JDK源码里一个普通的类有这样的类十个,那岂不是要建10个JAVA文件?

2013年1月04日 13:45
0 0

这是一个匿名内部类,实现ThreadLocal这个接口,在你不想创建一个新的类或创建一个新的类通用性不是很高的时候,可以这么用。很方便

2013年1月04日 13:00
0 0

private static   是私有  静态方法
所以外部当然不能调用

起到保护作用了

2013年1月04日 11:08

相关推荐

    java 面试题 总结

    Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA基础知识精华总结 收藏

    (1) 一个类继承了一个类和接口,那么必须将类写在前面,接口写在后面,接口之间用逗 号分隔。 (2) 接口之间可多重继承,注意使用关键字extends。 (3) 一个类虽只实现了一个接口,但不仅要实现这个接口的所有方法...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    超级有影响力霸气的Java面试题大全文档

     Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,...

    java面试题

    答:JDO是java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。 CORBA? 答:CORBA标准是公共对象请求代理结构,用途为:用不同的程序设计语言书写,在不同的...

    Java的六大问题你都懂了吗

    在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,...

    【05-面向对象(下)】

    •Java 7为所有包装类增加一个新方法: compare(x , y)的方法。该方法用于比较两个包装类实例,当x&gt;y, 返回大于0的数;当x==y,返回0;否则返回小于0的数。 对象的方法 •打印对象和toString方法:...

    Java初学者都必须理解的六大问题

    在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,...

    Java中this与super的区别

    而什么是super,可以理解为是指向自己超(父)类对象的一个指针, 而这个超类指的是离自己最近的一个父类。super的作用同样是可以作为构造函数使用, 或者是获取被局部变量屏蔽掉的父类对象的某个同名变量的值。 ...

    通过java操作excel表格的工具类库jxl

     ②处代码使用了WritableCellFormat类,这个类非常重要,通过它可以指定单元格的各种属性,后面的单元格格式化中会有更多描述。 ③处使用了Label类的构造子,指定了字串被赋予那种格式。在WritableCellFormat类中,...

    java基础知识下载

    Java语言中,标识符是以字母,下划线(_),美元符($)开始的一个字符序列,后面可以跟字母,下划线,美元符,数字。例如,identifier,userName,User_Name,_sys_val, $change为合法的标识符,而2mail room#,class...

    jbpm安装及使用方法

    同样,Assignable只是一个接口,它有两个方法:setActorId()和setPooledActors(),Assignable的具体实现类也是两个:swimlaneInstancehe和taskInstance。这样就不不难理解整个任务分配流程了: 1、流程进入TaskNode...

    新版Android开发教程.rar

    也有分析认为,谷歌并不想做一个简单的手机终端制造商或者软件平台开发商,而意在一统传统互联网和 移 动互联网。----------------------------------- Android 编程基础 4 Android Android Android Android 手机新...

    java线程池概念.txt

     largestPoolSize只是一个用来起记录作用的变量,用来记录线程池中曾经有过的最大线程数目,跟线程池的容量没有任何关系。 c:添加线程池任务的入口就是execute(); 复制代码 public void execute(Runnable ...

    springmybatis

    请注意,这里面有一个方法名 selectUserByID 必须与 User.xml 里面配置的 select 的id 对应() 重写测试代码 程序代码 程序代码 public static void main(String[] args) { SqlSession session = ...

    day020-继承加强和设计模式代码和笔记.rar

    先在类中创建一个对象 (联想到封装) =&gt; 提供一个公共的 getInstance给外部返回一个对象 3. 步骤: 1. 私有化构造方法 2. 在类中创建一个对象,并且用private、static、final修饰 ...

    @SuppressWarnings

    )下面是一个清单: 关键字 用途 deprecation 使用了不赞成使用的类或方法时的警告 unchecked 执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型。 fallthrough 当 Switch ...

Global site tag (gtag.js) - Google Analytics