Properties properties = AppConfigurationManager.getInstance().getProperties(ObjectContainer.class);
我有这个填充属性的代码。
我想装饰这个用于验证一个字段。
public class PropertiesDecorator extends Properties{
public void ValidateFooservHost(){
for(Entry<Object, Object> element : this.entrySet()){
if(element.getKey().toString().equals("ffxserv_host")){
String newHostValue = ffxServHostCheck(element.getValue().toString());
put(element.getKey(), newHostValue);
}
}
}
@Override
public Object setProperty(String name, String value) {
if(name.equals("foo")){
value = fooHostCheck(value);
}
return put(name, value);
}
public String fooHostCheck(String valueFromConfig){
String firstTwoChars = valueFromConfig.substring(0, 2);
if(firstTwoChars.equals("1:")){
return valueFromConfig.substring(2, valueFromConfig.length());
}
return valueFromConfig;
}
}
然而,
PropertiesDecorator properties = (PropertiesDecorator) AppConfigurationManager.getInstance().getProperties(ObjectContainer.class);
这失败了。我没有一个信息丰富的描述,但它只是说它失败了。不确定。什么。
我在这里做错了什么?也?
我该如何解决这个问题?
或者你会推荐一些不同的东西吗?
我应该使用策略模式吗?将属性传递给PropertiesDecorator,并在那里进行验证?
修改: 我已经看到我得到了阶级演员异常。
感谢。
答案 0 :(得分:2)
您收到ClassCastException,因为第三方代码返回的是Properties实例,而不是PropertiesDecorator的实例。一个简单的解决方案是让您的PropertiesDecorator接受一个Properties对象,并让它将所有属性合并到您的对象中。也就是说,如果您希望PropertiesDecorator与Properties具有“is a”关系。
否则,您可以使用委托给基础Properties实例的Adapter pattern来使用PropertiesAdapter并进行验证。为了完整性,下面是Properties的一个非常基本的适配器类。必要时添加验证码和其他委托方法。
public class PropertiesAdapter{
private Properties props;
public PropertiesAdapter(){
this.props = new Properties();
}
public PropertiesAdapter(Properties props){
this.props = props;
}
public Object set(String name, String value){
return this.props.setProperty(name, value);
}
public String get(String name){
return this.props.getProperty(name);
}
}