我怎么能控制另一个类中的构造函数访问

时间:2012-09-02 19:50:23

标签: java design-patterns constructor

我创建了一个将处理数据库访问的类(ProjectsDataAccess),这是该类可以执行的操作:

  1. 接收Project对象并将其保存到数据库中。
  2. 从数据库中按ID检索项目并将其作为Project对象返回。
  3. 这是类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;
      }
    }
    

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

2 个答案:

答案 0 :(得分: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;
   }
}

答案 1 :(得分: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 );