我们需要构建一个Resource
,它可以是以下两种类型之一:Logical
或Physical
。对于每个资源子类型,我们附加了Configuration
,可以是LogicalConfiguration
和PhysicalConfiguration
。
这样做是因为配置对象是可编辑的,需要进行版本控制。例如资源可以有两个配置版本:active和draft。 Resource
中提供了一种方法来添加配置addConfiguration(Configuration config)
现在,我们遇到了一个问题,LogicalConfiguration
可能会错误地传递给addConfiguration
的{{1}}方法。
PhysicalResource
此调用将成功,并且将添加错误的配置。可以使用以下方法来避免这种情况。
Resource resource = new PhysicalResource()
Configuration config = new LogicalResourceConfiguration();
physicalResource.addConfiguration(config)
检查或定义成员instanceOf
,但这会杀死多态性。Type
/ addLogicalConfiguration
其中一个方法在运行时失败。解决此问题最合适的方法是什么?或者是否有解决这类问题的具体模式?
答案 0 :(得分:1)
您可以向Resource类添加泛型类型参数:
class Resource<T extends Configuration> {
public void addConfiguration(T config) {}
}
然后,您可以:
class PhysicalResource extends Resource<PhysicalConfiguration> {...}
class LogicalResource extends Resource<LogicalConfiguration> {...}
答案 1 :(得分:0)
当尝试向Configuration
添加错误的Resource
类型时,通过提供编译错误,此结构应符合您的期望:
abstract class Configuration {
}
class LogicalConfiguration extends Configuration {
}
class PhysicalConfiguration extends Configuration {
}
abstract class Resource<C extends Configuration> {
private C config;
public void addConfiguration(C config) {
this.config = config;
}
public C getConfig() {
return config;
}
}
class LogicalResource extends Resource<LogicalConfiguration> {
}
class PhysicalResource extends Resource<PhysicalConfiguration> {
}
完全按照您的示例使用它:
Resource resource = new PhysicalResource()
Configuration config = new LogicalResourceConfiguration();
//COMPILATION ERROR:
physicalResource.addConfiguration(config);
答案 2 :(得分:0)
将这些课程放入他们自己的包中,并在addConfiguration
受保护的Resource
中进行操作。
这样,任何使用你的软件包的人都会在代码编写时发现错误。