3

我创建了一个类(ProjectsDataAccess)来处理对数据库的访问,这是该类可以做的:

  1. 接收 Project 对象并将其保存到数据库中。
  2. 从数据库中按 id 检索项目并将其作为 Project 对象返回。

这是类psudo代码:

 class ProjectsDataAccess {

        public void addProject(Project project) {
          // get the project data from the object and save it to the database
        }

        public void getProject() {
         // get the project data from the database and return new project 
         //object with that data
        }

      }

这是项目对象:

class Project{

   private String name;
   private int id;

   private Project(){}

   Project(int id, String name){
     this. id = id;
     this.name = name;
   }
   Project(String name){
     this. id = // generate id
     this.name = name;
  }
}

我的问题是我不希望该类的用户使用此构造函数创建对象并提供自己的 ID Project(int id, String name),但我只希望 ProjectsDataAccess 类使用它,以便它能够从数据库中检索数据(包括 id)然后使用构造函数设置它。有没有办法我可以改变我的设计来做到这一点。

4

2 回答 2

1

一个解决方案是将ProjectsDataAccessProject类保持在同一个包中,并使构造函数Project(int id, String name) 包可见(没有任何修饰符,就像现在一样)。另一个构造函数Project(String name)需要public对客户端代码可见。当然,将客户端代码放在不同的包中。

 package foo;

 public class ProjectsDataAccess {

    public void addProject(Project project) {
      // get the project data from the object and save it to the database
    }

    public void getProject() {
     // get the project data from the database and return new project 
     //object with that data
    }

  }



package foo;

public class Project {

   private String name;
   private int id;

   private Project(){}

   Project(int id, String name){
      this. id = id;
      this.name = name;
   }

   public Project(String name){
      this. id = // generate id
      this.name = name;
   }
}
于 2012-09-02T19:58:00.413 回答
0

我建议您仅使用用户应该调用的方法向用户返回不同的界面。

例如:

interface UserProjectInterface
{
   void AnyMethodUserIsSupposedToCall();
}

class Project implements ProjectUserInterface
{
   //constructor won-t be no longer visible to the client class
   public Project(){}
}

然后只返回接口:

class ProjectsDataAccess {

   public void addProject(ProjectUserInterfaceproject);


   public ProjectUserInterfacegetProject getProject() {
     return new Project();
   }

}

这种模式有几个不同的优点,因为您没有将具体类型暴露给客户端类。


编辑:

如果用户应该创建 UserProjectInterface 您可以使用工厂(例如AbstractFactory),以便封装对象创建:

interface AbstractProjectFactory
{
    UserProjectInterface CreateProject();

}

并提供一个实例化您的具体对象的实现:

public AConcreteProjectFactory implements AbstractProjectFactory
{
    public UserProjectInterface CreateProject()
    {
       return new Project();
    }
}

使用示例:

//client class:
AbstractProjectFactory factory = new AConcreteProjectFactory();
UserProjectInterface project = factory.CreateProject();

ProjectsDataAccess access = new ProjectsDataAccess();
access.addProject(project );
于 2012-09-02T19:59:05.183 回答