0

List と別のクラス オブジェクトを引数として取るメソッドがあります。メソッドに渡すクラス オブジェクトに基づいて、リストを反復処理したいと考えています。このクラスには 3 つの異なるコンストラクターがあります。1 つは Date オブジェクトを受け取り、もう 1 つは文字列を受け取り、3 つ目は int を受け取ります。私のメソッドでは、使用されているクラス オブジェクトに使用されているコンストラクターに応じて、さまざまなことを行いたいと考えています。これを行う方法はありますか?使用されているクラス オブジェクトのタイプ (コンストラクターに基づく) をチェックする if else ステートメントを実行する方法はありますか?

CodeWarrior の場合: コンストラクターの例を次に示します。

    public DateRange(Date date1, Date date2){

}

public DateRange(String string1, String string2){

}

public DateRange(int month, int year){

}

次に、次のようなメソッドがあるとします。

public static List<Schedule> getSchedule(List<Schedule> schedules, DateRange dateRange) {
    List<Schedule> schedules = new ArrayList<Schedule>();
    for (Schedule scheduleTime : schedules){
        if

どのタイプの DateRange が使用されたかを何らかの方法でチェックする if ステートメントを設計し、それに基づいてさまざまなことを行う方法を設定したいと思います。

4

3 に答える 3

1

これがあなたが探しているものだと思います。

DateRange クラスを変更して、作成方法がわかるようにします。

public class DateRange {
    private final Object obj1;
    private final Object obj2;
    public DateRange(Date date1, Date date2) {
        obj1 = date1;
        obj2 = date2;
    }
    public DateRange(String string1, String string2) {
        obj1 = string1;
        obj2 = string2;
    }
    public DateRange(int month, int year) {
        obj1 = Integer.valueOf(month);
        obj2 = Integer.valueOf(year);
    }
    public boolean isDate() { return obj1 instanceof Date; }
    public boolean isString() { return obj1 instanceof String; }
    public boolean isInt() { return obj1 instanceof Integer; }
}

呼び出し/チェックの構文は次のとおりです。

public static List<Schedule> getSchedule(List<Schedule> schedules, DateRange dateRange) {
    for (Schedule scheduleTime : schedules) {
        if(dateRange.isDate()) {
            // Do something based on the Date constructor.
        } else if(dateRange.isString()) {
            // Do something based on the String constructor.
        } else if(dateRange.isInt()) {
            // Do something based on the int constructor.
        }
    }
    return schedules;
}

クラスをさらに変更する必要がある別のオプションは、DateRange継承を使用DateRangeして、コンストラクターの型に基づいてクラスのファミリーを作成することです。基本クラスには、継承された、、およびクラスのそれぞれによって提供されるものとDateRange同様の抽象メソッドがあります。そうすれば、反復で if ツリーを処理する必要さえないかもしれません。doSomething()DateRangeDateDateRangeStringDateRangeInt

これが役立つことを願っています!

于 2013-02-13T07:07:34.570 に答える
0

オブジェクトのインスタンス化に使用されるコンストラクターのタイプを取得できるかどうかはわかりませんが、実行できることは、コンストラクターのタイプごとに、後で確認する特定のパラメーターを設定することです。たとえば、コンストラクターごとにブール変数を設定できます(最初はすべてfalse)。特定のコンストラクターが呼び出された場合は、それぞれの変数をtrueに設定します。または、コンストラクターごとに整数フィールドを特定の数値に設定し、後でそのフィールドの値を確認します。

于 2013-02-13T06:32:04.210 に答える
0

JVM は、オブジェクトのインスタンス化に使用されたコンストラクターのバージョンを保存しません。これは、何らかの方法で保存し、それに応じてコーディングする必要がある情報です。投稿した例については、これを試してください

//DateRange.java

public class DateRange{

    private int constructorType;

    public DateRange(Date date1, Date date2){
         constructorType = 1;
    }

    public DateRange(String string1, String string2){
         constructorType = 2;
    }

    public DateRange(int month, int year){
        constructorType = 3;
    }

    public int getConstructorType(){
          return constructorType;
    }
}

これは getSchedule() 関数です。

    public static List<Schedule> getSchedule(List<Schedule> schedules, DateRange dateRange) {
    List<Schedule> schedules = new ArrayList<Schedule>();
    for (Schedule scheduleTime : schedules){

        //use switch instead of if
        switch(dateRange.getConstructorType()){
           case 1: System.out.println("First constructor was called"); break;
           case 2: System.out.println("Second constructor was called"); break;
           case 3: System.out.println("Third constructor was called"); break;
           default: System.err.println("Something is wrong. Unknown constructor type"); break;
        }
    }
}
于 2013-02-13T07:08:08.113 に答える