1

次のドメイン オブジェクトがあります。

public interface Event {}    
public class FirstEvent {}    
public class SecondEvent {}

次に、ドメインオブジェクトから完全に分離する必要がある別のモジュールがあります。つまり、ドメインオブジェクトを認識していますが、ドメインオブジェクトはこの追加モジュールの存在を認識すべきではありません。

このモジュールでは、共通のインターフェイスEventを介してオブジェクトを受け取り、特定のイベント タイプに基づいて異なる動作をする必要があります。

現在、私のコードは次のようになっています。

if (event instanceof FirstEvent.class) {
    doFirst();
}
else if (event instanceof SecondEvent.class) {
    doSecond();
}

それは問題なく動作しますが、静的分析ツールとコード レビュー担当者は、使用すべきではなくinstanceof、よりオブジェクト指向のアプローチに置き換える必要があると不満を漏らしています。反射またはgetClass()オプションもありません。

Javaでそれを行う方法は?

の置換に関する多くの既存の質問を確認しましinstanceofたが、それらはすべてドメイン オブジェクトにロジックを直接追加することを提案していました。ただし、この場合、モジュールに固有のロジックでそれらを汚染したくありません。

4

2 に答える 2

0

除外することReflectionは理解できますが、使用getClass()は問題になりません。

この問題を処理するための私の解決策:

import java.util.concurrent.ConcurrentHashMap;
import java.util.Map;

public class DynamicDispatch{
    Map<String,Event> events = new ConcurrentHashMap<String,Event>();
    public DynamicDispatch(){
        Event event = new FirstEvent();
        events.put(event.getName(),event);
        event = new SecondEvent();
        events.put(event.getName(),event);
    }
    public Event getEvent(String eventName){
        return events.get(eventName);
    }
    public static void main(String args[]){
        DynamicDispatch dispatchObj = new DynamicDispatch();
        Event event = dispatchObj.getEvent(args[0]);
        System.out.println("dispatchObj:"+event+":"+event.getName());
    }
}

interface Event {
    public String getName();
}
class FirstEvent implements Event{
    public String getName(){
        //return this.getClass().getSimpleName();
        return "FirstEvent";
    }
}
class SecondEvent implements Event{
    public String getName(){
        //return this.getClass().getSimpleName();
        return "SecondEvent";
    }
}

出力:

java DynamicDispatch FirstEvent
dispatchObj:FirstEvent@72d86c58:FirstEvent

java DynamicDispatch SecondEvent
dispatchObj:SecondEvent@72d86c58:SecondEvent

それでもreturn this.getClass().getSimpleName();、値をハードコーディングする代わりに使用することを好みます。

上記のコードが で問題ないことを願っていstatic analysis toolsます。

于 2016-04-06T18:36:51.093 に答える