我创建了一个将处理数据库访问的类(ProjectsDataAccess),这是该类可以执行的操作:
这是类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),然后使用构造函数设置它。有没有办法可以改变我的设计。
答案 0 :(得分:1)
解决方案是将ProjectsDataAccess
和Project
类保留在同一个包中,并使构造函数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 );