扩展属性失败

时间:2012-05-11 19:29:25

标签: java properties decorator strategy-pattern

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

修改: 我已经看到我得到了阶级演员异常。

感谢。

1 个答案:

答案 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);
    }
}