0
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,并在那里进行验证?

编辑:我已经看到我得到了类转换异常。

谢谢。

4

1 回答 1

3

您收到 ClassCastException 是因为第三方代码返回的是 Properties 实例,而不是 PropertiesDecorator 实例。一个简单的解决方案是让您的 PropertiesDecorator 接受一个 Properties 对象,并将其所有属性合并到您的中。也就是说,如果您希望 PropertiesDecorator 与 Properties 具有“是”关系。

否则,您可以只拥有一个使用Adapter 模式的 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);
    }
}
于 2012-05-11T19:38:15.130 回答