我有一个共享相同“状态”并执行 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()
设为 public
、static
函数,并在实例化任何子类之前调用它:
Client.buildStateFromArgs(args);
UserClient client = new UserClient();
...
关于Java从父对象实例化子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47007394/