public class WebContext(){
private HttpServletRequest request;
private WebContext(){};
public static WebContext newPrototype(HttpServletRequest request){
WebContext wc = new WebContext();
wc.request = request;
}
public boolean isLogin(){
return request.getSession().getAttribute(CONSTANT.SESSION_TOKEN)==null;
}
private RemoteUser getRemoteUser(){
RemoteUser ru = new RemoteUser();
if(isLogin()){
ru = ...; //...get remote user info from remote server
}
return ru;
}
public User getUser(){
User user = new User();
if(isLogin()){
RemoteUser ru = getRemoteUser();
long userid = ru.getUserid();
user = ...; //... get user info from db by userid;
}
return user;
}
public Trader getTrader(){
Trader trader = new Trader();
if(isLogin()){
RemoteUser ru = getRemoteUser();
long traderid = ru.getTraderid();
trader = ...; //... get trader info from db by traderid;
}
return trader;
}
}
this make me uncomfortable, getUser() and getTrader() all must invoke getRemoteUser() firstly. so i refactor this class to
public class WebContext(){
private HttpServletRequest request;
private boolean isLogin;
private RemoteUser ru;
private WebContext(){};
public static WebContext newPrototype(HttpServletRequest request){
WebContext wc = new WebContext();
wc.request = request;
wc.islogin = request.getSession().getAttribute(CONSTANT.SESSION_TOKEN)==null;
wc.ru = getRemoteUser();
}
public boolean isLogin(){
return isLogin;
}
private RemoteUser getRemoteUser(){
RemoteUser ru = new RemoteUser();
if(isLogin){
ru = ...; //...get remote user info from remote server
}
return ru;
}
public User getUser(){
User user = new User();
if(isLogin){
long userid = ru.getUserid();
user = ...; //... get user info from db by userid;
}
return user;
}
public Trader getTrader(){
Trader trader = new Trader();
if(isLogin){
long traderid = ru.getTraderid();
trader = ...; //... get trader info from db by traderid;
}
return trader;
}
}
refactored construct method init RemoteUser once. but i am confident about refactored construct method is not good for reused.i am confused how should i do for good code design;