用于接口,抽象类和实现的Java包

时间:2011-10-04 13:28:45

标签: java packages

AHOI!

即使我只有少量课程,我也想听听你对课程的建议。

我有一个GenericDAO接口,一个抽象GenericHibernateDAO类,一个UserDAO接口,最后一个UserDAOHibernate类。它们大致按照它们的一般程度排序 我当然会添加更多接口,例如UserDAOUserDAOHibernate,因此他们需要自己的包。

我还有一个GenericEntity接口,一个抽象的LongEntity类(需要一个更好的名字btw。)和User类。我将在后面添加更多类User类。

您会推荐多少个套餐以及您将使用哪些名称?

6 个答案:

答案 0 :(得分:3)

enter image description here

我建议使用500亿个包。每个类都有自己的包,但每个包都没有类。包裹应分享他们班级的名称。对于那些没有课程的套餐,只需闭上眼睛并砰击键盘即可命名。

答案 1 :(得分:0)

打包类和接口是一个有趣的主题。有些人在阵营中:“类和类功能可见性确定包装”,而其他人则在以下阵营中:“基于功能的包类和接口。

就个人而言,我做后者。在我的书中,基于类/功能可视性的打包限制是一个设计问题。

对于你的例子,我只看到两个:

what.ever.generic
what.ever.user

答案 2 :(得分:0)

您创建的包取决于某些因素。例如,如果您的API使用了包私有作用域,则可能与API更加开放时的排列方式不同。

您可以创建一个类似

的包

com.company.app.domain

适用于您的实体(您还可以为您的应用设置模型,实体或其他任何有意义的内容,而不是域名)

您可以创建

com.company.app.dao

为您的Daos。

如果要限制模型对象相互通信的方式,可以使用包中的DAO和服务为每种类型(如User)创建一个包。或者您也可以创建一个.user.service包。

在不了解您的应用程序设计的情况下,除了不需要创建复杂的包层次结构外,我不能说更多。

答案 3 :(得分:0)

对我来说听起来太复杂了。 (是的,我读过你以前的问题。)

当你有一个通用的DAO时,我不明白为什么你有UserDAOHibernate。

我这样做:

package persistence;

public interface GenericDao<K extends Serializable, V> {
    List<V> find();
    V find(K key);
    K save(V value);
    void update(V value);
    void delete(V value);
}

我有一个Hibernate实现,但用户的实例看起来像这样:

GenericDaoImpl<Long, User> userDao = new GenericDaoImpl<Long, User>();

关于实体的所有内容在我看来都是矫枉过正的。

答案 4 :(得分:0)

我肯定会按功能分组,而不是通过可见性或任何实现细节分组:

  • 实施更改(功能不应该),但是你想在这种情况下将你的课程转移到另一个包吗?

  • 对于类,没有人问过我是否应该将所有字符串/整数/集合变量放在一个单独的类中?但人们似乎更倾向于使用包组织。

答案 5 :(得分:0)

使用某些东西将实现注入到对象中。将接口用作私有成员类型。

class MyObject
{
  private GenericDao meaningfulName;
  private UserDao meaningfulName;
}

blah.dao - DAO interfaces here.
blah.dao.hibernate - Hibernate implementation of DAO interfaces here.
blah.entity - GenericEntity here.  Abstract (i.e. base) implementations of
              interfaces here (LongEntity for example).
blah.entity.impl - Implementation of GenericEntity here.
blah.domain - Domain classes like User here.

而不是LongEntity可能使用BaseEntity