查看hibernate源碼发现:/** from: spring-framework-2.5.6.jar **/
/* */ public class HibernateTemplate extends HibernateAccessor
/* */ implements HibernateOperations
/* */ {//.............../* */ public Object get(String entityName, Serializable id, LockMode lockMode)
/* */ throws DataAccessException
/* */ {
/* 544 */ return executeWithNativeSession(new HibernateCallback(lockMode, entityName, id) {
/* */ public Object doInHibernate(org.hibernate.Session session) throws HibernateException {
/* 546 */ if (this.val$lockMode != null) {
/* 547 */ return session.get(this.val$entityName, this.val$id, this.val$lockMode);
/* */ }
/* */
/* 550 */ return session.get(this.val$entityName, this.val$id);
/* */ }
/* */ });
/* */ }//.........../** from: spring-framework-2.5.6.jar **/
public abstract interface HibernateCallback
{
public abstract Object doInHibernate(Session paramSession)
throws HibernateException, SQLException;
}
HibernateTemplate 类的get方法使用了匿名内部类,HibernateCallback是接口。
疑问是:new HibernateCallback(lockMode, entityName, id)为什么可以带参数?
其它地方还可以带其它不同个数的参数,求大牛解释。java的接口有这种用法吗?
我自己写的为什么不行:/********* StuffAdd.java ***********/
package com.fooo.interfacedemo;public class StuffAdd { private String data;
public void add(Object o){
this.data += o.toString();
} public String getData() {
return data;
} public void setData(String data) {
this.data = data;
}
}
/********* IFooInterface .java ***********/package com.fooo.interfacedemo;public abstract interface IFooInterface { public abstract String doFoo(StuffAdd s);
}/********* FooInterfaceClient .java ***********/
package com.fooo.interfacedemo;public class FooInterfaceClient { private StuffAdd sa; public StuffAdd getSa() {
return sa;
} public void setSa(StuffAdd sa) {
this.sa = sa;
} public Object foo1(IFooInterface inter) {
return inter.doFoo(sa);
}}/********* TestIFooInterface .java ***********/
package com.fooo.interfacedemo;public class TestIFooInterface {
private static void doFun(final int a,final String b, final float c){ FooInterfaceClient client = new FooInterfaceClient();
StuffAdd sa = new StuffAdd();
client.setSa(sa);
client.foo1(new IFooInterface(a,b,c) {
public String doFoo(StuffAdd s) {
s.add(a);
s.add(b);
s.add(c);
System.out.println(s.getData().toString());
}
});
}
/**
* @param args
*/
public static void main(String[] args) {
doFun(1,"2",3.3f); }}
/* */ public class HibernateTemplate extends HibernateAccessor
/* */ implements HibernateOperations
/* */ {//.............../* */ public Object get(String entityName, Serializable id, LockMode lockMode)
/* */ throws DataAccessException
/* */ {
/* 544 */ return executeWithNativeSession(new HibernateCallback(lockMode, entityName, id) {
/* */ public Object doInHibernate(org.hibernate.Session session) throws HibernateException {
/* 546 */ if (this.val$lockMode != null) {
/* 547 */ return session.get(this.val$entityName, this.val$id, this.val$lockMode);
/* */ }
/* */
/* 550 */ return session.get(this.val$entityName, this.val$id);
/* */ }
/* */ });
/* */ }//.........../** from: spring-framework-2.5.6.jar **/
public abstract interface HibernateCallback
{
public abstract Object doInHibernate(Session paramSession)
throws HibernateException, SQLException;
}
HibernateTemplate 类的get方法使用了匿名内部类,HibernateCallback是接口。
疑问是:new HibernateCallback(lockMode, entityName, id)为什么可以带参数?
其它地方还可以带其它不同个数的参数,求大牛解释。java的接口有这种用法吗?
我自己写的为什么不行:/********* StuffAdd.java ***********/
package com.fooo.interfacedemo;public class StuffAdd { private String data;
public void add(Object o){
this.data += o.toString();
} public String getData() {
return data;
} public void setData(String data) {
this.data = data;
}
}
/********* IFooInterface .java ***********/package com.fooo.interfacedemo;public abstract interface IFooInterface { public abstract String doFoo(StuffAdd s);
}/********* FooInterfaceClient .java ***********/
package com.fooo.interfacedemo;public class FooInterfaceClient { private StuffAdd sa; public StuffAdd getSa() {
return sa;
} public void setSa(StuffAdd sa) {
this.sa = sa;
} public Object foo1(IFooInterface inter) {
return inter.doFoo(sa);
}}/********* TestIFooInterface .java ***********/
package com.fooo.interfacedemo;public class TestIFooInterface {
private static void doFun(final int a,final String b, final float c){ FooInterfaceClient client = new FooInterfaceClient();
StuffAdd sa = new StuffAdd();
client.setSa(sa);
client.foo1(new IFooInterface(a,b,c) {
public String doFoo(StuffAdd s) {
s.add(a);
s.add(b);
s.add(c);
System.out.println(s.getData().toString());
}
});
}
/**
* @param args
*/
public static void main(String[] args) {
doFun(1,"2",3.3f); }}
上面的逻辑有一点问题,少了一句:
client.foo1(new IFooInterface(a,b,c) {
public String doFoo(StuffAdd s) {
s.add(a);
s.add(b);
s.add(c);
System.out.println(s.getData().toString());
return s.getData(); //added
}
});
abstract class IFooInterface {
IFooInterface(int a,String b,float c){
}
public abstract String doFoo(StuffAdd s);
}加上构造方法,亲