参照ThreadLocal<T>完成如下
- public abstract class BaseHelper<T> {
- private T object = null;
- private HttpServletRequest request;
- private String key;
- public BaseHelper(HttpServletRequest request, String key) {
- this.request = request;
- this.key = key;
- object = (T)request.getSession().getAttribute(key);
- if(object == null){
- object = initValue();
- }
- }
- public T get(){
- return object;
- }
- protected abstract T initValue();
- }
- public class BaseHelperTest extends TestCase {
- private BaseHelper<Product> sm;
- protected void setUp() throws Exception {
- HttpServletRequest request = new MockHttpServletRequest();
- sm = new BaseHelper<Product>(request, "x_key"){
- protected Product initValue(){
- return new Product();
- }
- };
- }
- protected void tearDown() throws Exception {
- super.tearDown();
- }
- /*
- * Test method for 'com.ecc.beauty.common.page.SessionManager.getAttrbute(String)'
- */
- public void testGet() {
- assertNotNull(sm.get());
- }
- }
public abstract class BaseHelper<T> {
private T object = null;
private HttpServletRequest request;
private String key;
public BaseHelper(HttpServletRequest request, String key) {
this.request = request;
this.key = key;
object = (T)request.getSession().getAttribute(key);
if(object == null){
object = initValue();
}
}
public T get(){
return object;
}
protected abstract T initValue();
}
public class BaseHelperTest extends TestCase {
private BaseHelper<Product> sm;
protected void setUp() throws Exception {
HttpServletRequest request = new MockHttpServletRequest();
sm = new BaseHelper<Product>(request, "x_key"){
protected Product initValue(){
return new Product();
}
};
}
protected void tearDown() throws Exception {
super.tearDown();
}
/*
* Test method for 'com.ecc.beauty.common.page.SessionManager.getAttrbute(String)'
*/
public void testGet() {
assertNotNull(sm.get());
}
}
这种方式可以实现一个类代替 A B C等一系列类,但是在每一个用到的地方都写这样一段代码感觉不够优雅
- sm = new BaseHelper<Product>(request, "x_key"){
- protected Product initValue(){
- return new Product();
- }
- };
方法B:Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];