0
Properties properties = AppConfigurationManager.getInstance().getProperties(ObjectContainer.class);

プロパティを設定するこのコードがあります。

1つのフィールドの検証のためにこれを飾りたいです。

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

サードパーティのコードがPropertiesDecoratorのインスタンスではなく、Propertiesのインスタンスを返しているため、ClassCastExceptionが発生しています。簡単な解決策は、PropertiesDecoratorにPropertiesオブジェクトを受け入れさせ、そのすべてのプロパティを自分のプロパティにマージさせることです。つまり、PropertiesDecoratorにPropertiesとの「isa」関係を持たせたい場合です。

それ以外の場合は、基になるPropertiesインスタンスに委任して検証を行うAdapterパターンを使用してPropertiesAdapterを作成することができます。完全を期すために、以下はプロパティの非常に基本的なアダプタクラスです。必要に応じて、検証コードと追加のデリゲート方法を追加します。

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 に答える