请教,这样需不需要使用对象池,这样设计有问题吗?

02-11-16 scorpio_leon
    

自己的班级网站,不用什么EJB,Struts的模式,简单的javabean+servlet+jsp,但是想设计的好一点,刚写到User部分遇到一个问题

User.java

public interface User {
    public abstract User getUserById(long userid);// like a static method
	public abstract int insert(Connection conn);
	public abstract int delete(Connection conn);
    public abstract int update(Connection conn);
    public abstract long getUserid();
    public abstract void setUserid(long id);
    ......
}
<p>

AbstractUser.java

public abstract class AbstractUser implements User {
	protected long userid;
	.......
    public abstract User getUserById(long userid);// like a static method
	......
}
<p>

以前这部分是直接写User Class的,现在改成以上的模式,但发现原来用到的静态方法不可写在Interface中,只能写成非静态的(是不是像EJB2的Home方法?)

那么在以下的UserManager需要用到很多次User中的这些"静态方法",那么我就想用一个User的静态变量来调用那些方法

UserManager.java

public class UserManager {
    private static Logger logger =
        (Logger) Logger.getLogger(UserManager.class.getName());
    private static User USER = DAOFactory.getUser();
    ......
}    

<p>

DAOFactory.java

public class DAOFactory {
    
    private static Logger logger =
        (Logger) Logger.getLogger(DAOFactory.class.getName());

	public static User getUser() {
		User user = null;
		try {
			InitialContext ic = new InitialContext();
			String className = (String) ic.lookup(JNDINames.USER_DAO_CLASS);
			user = (User) Class.forName(className).newInstance();
		} catch (NamingException ne) {
            logger.error("DAOFactory.getUser occured a error about JNDI name: ", ne);
		} catch (Exception se) {
            logger.error("DAOFactory.getUser occured a unknown error: ", se);
		}
		return user;
	}

}

<p>

但我又担心这些方法中的数据在共享访问中会出现不一致,而同步这些方法开销太大了吧,那么我就是要用对象池?

不知道这样考虑是不是有必要,关于数据在共享访问,以及使用同步方面我理解不深,很不确定,谢谢解答 ^_^

    

jxb8901
2002-11-16 10:17

我觉得你的类之间的职责划分好象不是很明确, User类中的getUserById(),

insert(), delete()方法应该放在UserManager类中, 如果这样getUserById

就可以是static的.

你可以参考一下Jive中的User和UserManager类, Jive中的User类只包含与某个用户有关的属性的set/get方法, 而UserManager中则包含Create,Delete,

GetUser等属于管理者的方法, 这样划分概念很明确.

我也是Java新手, 希望多探讨.

scorpio_leon
2002-11-16 10:42

谢谢!

insert,delete,update,getUserById等方法我觉得是属于User的基本原子方法

放在User中也有道理呀,所以才要用interface-abstrace这样设计,就是要封装User,而UserManager只是调用User的各种方法来达到一定的目的,否则DAO的意义就不大了,或者用在另一个地方,反正我看jive的那一套还不是很好,不能说服我完全学他的,或许我看得还不够全面^ ^

jxb8901
2002-11-16 14:03

我的理解是User类应该代表某一个用户, 从对象角度来理解, 它有自己的

属性和方法, 在问题域每个用户都有自己的name, id等属性这一点应该没有

争议, 另外我们可以请求一个用户修改他自己的name, 但若我们请求一个用户

create或delete(不知能否和你的User中的insert和delete对应另外一个用户

好象不合逻辑; 还有一个用户已经有一个唯一的, 你若要求一个用户根据ID

查找出另一个用户(对应getUserById)是不是也不合逻辑呢?

想听一下你觉得Insert等方法是User的"原子方法"的理由.

scorpio_leon
2002-11-17 08:28

谢谢,你说的有道理^ ^

不过我现在只是想把User相关的最基本方法(insert....)由自身实现,其实我还不觉得分开有什么太大的好处,因为这些基本方法是由属性决定的。不过现在外面很多例子确实如你所说,应该是有一定道理的。但到我现在应用的层次还没感觉出来。

insert(),update(),delete()当然只对自身了,就根据主键嘛

而getUserById我上面也说了,本应是静态方法,本不应该与实例有联系的

可以看看那我原来提的问题吗?^ ^

3Go 1 2 3 下一页