弄Service层,处理继承和泛型时还遇到一点小问题,也还是记录一下吧。
整体结构同dao层,分接口和实现类,接口有个父接口BaseService,实现也有个父类BaseServiceImpl。
主要记录一下遇到的一点小问题吧。开始设想是在BaseServiceImpl中定义一个公共的protected变量:BaseDao,用以实现每个Service关于自己对应实体的基本操作:
package mybatistest.service.impl;
import java.io.Serializable;
import mybatistest.dao.BaseDao;
import mybatistest.service.BaseService;
public abstract class BaseServiceImpl<T, PK extends Serializable> implements BaseService<T, PK>{
protected BaseDao mainDao;
public T getByID(PK id){
return (T) mainDao.getByID(id);
};
}
UserServiceImpl.java
package mybatistest.service.impl;
import mybatistest.dao.impl.UserDaoImpl;
import mybatistest.entity.User;
import mybatistest.service.UserService;
public class UserServiceImpl extends BaseServiceImpl<User, String> implements
UserService {
public UserServiceImpl() {
mainDao = new UserDaoImpl();
}
public String userLogin(String userNumber, String userPassword) {
User user = (User) mainDao.getByID("1");
if (null == user) {
return "用户不存在!";
}
if ("XXX" != userPassword) {
return "密码不正确!";
}
return "登录成功!";
}
}
但这里发现三个问题:
1、BaseServiceImpl要做类型转换;
2、每个继承的子类使用时都要做强制转换;
3、对BaseDao子接口(比如UserDao)中实现的单独方法(未在BaseDao中定义的方法)调用前又要做强制转换;
这个不科学啊
eclipse真是强大,重新审视了一下代码,边改边看eclipse中的提示,结果发现是要这样:
BaseServiceImpl.java
package mybatistest.service.impl;
import java.io.Serializable;
import mybatistest.dao.BaseDao;
import mybatistest.service.BaseService;
public abstract class BaseServiceImpl<T, PK extends Serializable> implements
BaseService<T, PK> {
protected BaseDao<T, PK> mainDao;
public T getByID(PK id) {
return mainDao.getByID(id);
};
}
UserServiceImpl.java
package mybatistest.service.impl;
import mybatistest.dao.impl.UserDaoImpl;
import mybatistest.entity.User;
import mybatistest.service.UserService;
public class UserServiceImpl extends BaseServiceImpl<User, String> implements
UserService {
public UserServiceImpl() {
mainDao = new UserDaoImpl();
}
public String userLogin(String userNumber, String userPassword) {
User user = mainDao.getByID("1");
if (null == user) {
return "用户不存在!";
}
if ("XXX" != userPassword) {
return "密码不正确!";
}
return "登录成功!";
}
}
这样就不用强制转换了,解决了1、2的问题。但发现3的问题还没有解决,还是要((UserDao) mainDao)强制转换一下才能使用UserDao中单独定义的方法。先标记一下,回头再网上查一下看看,是不是只能强制转换。
或者,Service层不适合继承?1、ServiceImpl中的方法,可能会用到多个Dao来实现某种业务逻辑;2、将来用Spring注入,对于这种继承好不好使呢?先放一下吧。
不得不说,java的泛型还是很强大。记得Delphi是在2009版才开始有泛型,且不完整。