像下面这段代码,ThreadLocal在初始化的时候后面接了一个方法,我在自己的代码中也试了一下,可以再大括号中定义变量定义方法,但是外部是不能调用的,我想知道这样写除了初始化还有什么用途和意义呢?
[code="java"]
private static ThreadLocal seqNum = new ThreadLocal(){
public Integer initialValue(){
return 0;
}
};
[/code]
匿名内部类。你通过这种写法从ThreadLocal继承了一个匿名的子类,在这个子类中覆盖了ThreadLocal的initialValue方法,同时创建了这个子类的一个实例(因为这个子类是匿名的,你无法在后续的代码里引用,所以必须在定义时同时创建实例)。
它的作用跟
[code="java"]
class OutterClass {
private static class MyThreadLocal extends ThreadLocal<Integer> {
public Integer initialValue(){
return 0;
}
}
private static MyThreadLocal seqNum = new MyThreadLocal();
}
[/code]
等价,好处是你不用专门为这个子类(MyThreadLocal)想一个名字,代码量也少一点。
private static 是私有 静态方法
所以外部当然不能调用
起到保护作用了
这是一个匿名内部类,实现ThreadLocal这个接口,在你不想创建一个新的类或创建一个新的类通用性不是很高的时候,可以这么用。很方便
这样写最大的好处是简洁,难道让我重新建一个java文件叫ThreadLocal.java?
JDK源码里一个普通的类有这样的类十个,那岂不是要建10个JAVA文件?
你这个例子的public的确没有任何的意义,一般如果你定义了内部的全局变量只是提供给这个内部类能用,一般我们这么写是为了重写某个接口,或者重载某个方法。
楼上的回答都没有搞清楚提问者到底想问什么。
给你个实例来看下好处, 比如 我们处理业务请求的时候, 都是需要事物来控制提交和回滚的, 是不是每次都需要重复的写 try catch 来begin和commit 或者rollback呢
定义一个你需要的接口来规范行为: 无需对它做实现类.
[code="java"]
public interface TransactionAction {
void execute(ActionEvent event) throws Exception;
}
[/code]
定义这个规范, 也就是成功提交 失败回滚
[code="java"]
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;
}
}
[/code]
业务中使用:
[code="java"]
public void next(ActionEvent event) throws Exception {
helper.transactionProcess(new TransactionAction() {
public void execute(ActionEvent event) throws Exception {
//这时候你只需要关注你的业务了, 不需要管事物了.
}
}
}
[/code]
[b]ActionEvent[/b]: 这个参数就是你业务对象了, 如一般BaseFormBean.
类的装载需要消耗系统资源,当你在开发移动应用时,一个按钮的点击事件只在这个按钮所在的页面中这个按钮被点击时才会被调用,所以一般用在比较私有的、用来实现继承方法比如listener的时候,会使用匿名内部类。