java入门学习(七)

来源:互联网 发布:阿里云备份 编辑:程序博客网 时间:2024/05/20 17:41

弄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> implementsUserService {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> implementsBaseService<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> implementsUserService {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版才开始有泛型,且不完整。

 



 

 

0 0
原创粉丝点击