0

問題:
マップのキーと値の Java タイプを見つけようとしていますが、マップを反復処理してから を使用する必要がなくinstanceof、マップが空であってもそれを知りたいです。 ここ (http://ckeditor.com/download) からダウンロードできる
context: は、マップを使用して実装されます。
CKEditorConfigただし、セッター メソッドが提供されておらず、コンストラクター インジェクションを使用して設定するためのコンストラクターが提供されていないため、インジェクションを使用してこのマップを設定することはできません。ただし、5 つの addConfigValue メソッド (以下を参照) があり、これらの値を追加するために使用できます。

public void addConfigValue(final String key, final Number value);
public void addConfigValue(final String key, final String value);
public void addConfigValue(final String key, final Boolean value);
public void addConfigValue(final String key, final Map<String, ? extends Object> value);
public void addConfigValue(final String key, final List<? extends Object> value);



j2ee/Java Web アプリのいくつかの場所で ckeditor を使用するので、エディターを初期化するために必要な設定を名前で返すファクトリー クラスを作成する必要があると考えました。しかし、これらの構成を外部化して、Spring コンテキスト ファイルに設定したかったのです。そのため、構成オブジェクトを作成できないため、通常のマップを使用してから、マップを使用して構成オブジェクトを構築する必要があります。しかし、オブジェクトを構築する前に、春から来るこれらのマップを検証する必要があります。

これは、構成オブジェクトを構築するための私の方法です:

    @SuppressWarnings("unchecked")
    public CKEditorConfig buildConfigFromMap(Map<String, Object> configMap) {
        CKEditorConfig config = new CKEditorConfig();
        for (String key : configMap.keySet()) {
            Object val = configMap.get(key);
            if (val instanceof Number)
                config.addConfigValue(key, (Number) val);
            else if (val instanceof String)
                config.addConfigValue(key, (String) val);
            else if (val instanceof Boolean)
                config.addConfigValue(key, (Boolean) val);
            else if (val instanceof List) {
                config.addConfigValue(key, (List<Object>) val);
            } else if (val instanceof Map) {
                // TODO
            }
            throw new IllegalArgumentException("invalid map value types");
        }
            return config;
    }

オブジェクトがマップであることがわかるように、そのキーが文字列であるかどうかを検証できる必要があります。私はこのようなことができることを知っています:

} else if (val instanceof Map) {
    for (Object mapKey : ((Map<Object, Object>) val).keySet()) {
    if (!(mapKey instanceof String))
        throw new IllegalArgumentException("invalid map value types");
    }
config.addConfigValue(key, (Map<String, Object>) val);
}

しかし、エクササイズ全体を通して、私は正しいことをしていないと思いますか? 助言がありますか?私はまったく異なるアプローチを使用することにオープンです。ご意見をお待ちしております。

4

2 に答える 2

5

不可能です。Java ジェネリックは実行時に消去されます。実際、それらはコンパイラ (およびソース コード) にのみ存在します。

キーと値の実際のタイプを調べて、そこから Map に使用されるジェネリックを推測することはできません。

管理下にあるマップのソース コード内のジェネリックのみを推測できます。

Spring に Map<String, ?> のみを提供するように強制したいようです。回避策は次のとおりです。

public class StringKeyMapEntry { public String key; public Object value; }

List<StringKeyMapEntry> または StringKeyMapEntry[] を注入し (Spring が配列を実行できるかどうかは不明)、それを Map<String, ?> に変換します。

于 2012-11-09T15:36:02.537 に答える
0

文字列によって参照される多くの設定があります... 1 つの方法を使用して、署名をこれに変更します。

public void configure(final Map<String, ? extends Object> map);

そして、各設定で必要なことを行います。各設定を直接呼び出すか、ループスルーすることができます。

于 2012-11-09T15:29:17.667 に答える