Java从父对象实例化子对象

标签 java design-patterns

我有一个共享相同“状态”并执行 CRUD 操作的以下类。此操作不可重复/幂等。

public class Client {
    private static String state;
    public Client(args){
        this.state = buildStateFromArgs();  // this value will not change
    }

    public void createUser();
    public User getUser();
    public User updateUser();
    public void deleteUser();

    public void createJob();
    public Job getJob();
    public Job updateJob();
    public void deleteJob();

    // other CRUD functions ....
}

我正在考虑将其重构为类似的内容

public class Client {
    public Client(args){
        this.state = buildStateFromArgs();
    }
    private static String state;
}

public class UserClient extends Client{
    public void createUser();
    public User getUser();
    public User updateUser();
    public void deleteUser();
}

但我不确定启动子类的最佳方法是什么。假设这是当前的实现,

Client client = new Client(args);
client.createUser();
client.createJob();

我应该只是沮丧吗?

Client client = new Client(args);
UserClient userClient = (UserClient) client;
userClient.createUser();
JobClient jobClient = (JobClient) client;
jobClient.createJob();

或者我应该从父级构造子级?

Client client = new Client(args);
UserClient userClient = new UserClient(client);
userClient.createUser();
JobClient jobClient = new JobClient(client);
jobClient.createJob();

或者是否有更好的设计模式适合此类问题?

最佳答案

鉴于 UserClient is-a Client,我将采取以下方法:

UserClient client = new UserClient();
client.createUser();

我采用这种方法的原因是用户特定的函数应该只存在于UserClient上,因此只能从这样的函数中调用。

鉴于状态必须在所有客户端之间共享的新信息,我可能会使用静态初始化程序:

class Client {
    private static String state;
    static {
        state = buildStateFromArgs(args);  // this value will not change
    }
}

这假设 args 此时可用。如果不是,那么您需要将 buildStateFromArgs() 设为 publicstatic 函数,并在实例化任何子类之前调用​​它:

Client.buildStateFromArgs(args);
UserClient client = new UserClient();
...

关于Java从父对象实例化子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47007394/

相关文章:

algorithm - 如何像 Excel 一样发现和分析相似的模式?

java - 在 Eclipse 插件中查找 IProject 中的所有注释

java - 在 PluginRegistry 中注册 bundle ?

Java删除文件夹仍然存在

javascript - 使用 JQuery Ajax 和 ASP.Net Mvc 的正确模式是什么?

ruby-on-rails - 在 Rails 中的何处放置创建模型和关联逻辑?

c# - 使用 xml 填充对象的设计模式

java - 克隆输入流

java - “While”循环未执行?

design-patterns - 红/黑部署和蓝/绿部署有什么区别?