2013-02-13 85 views
0

我有一個方法以List和另一個類對象爲參數。我想根據傳遞給方法的類對象遍歷列表。這個類有三個不同的構造函數。其中一個需要Date對象,另一個需要字符串,第三個需要輸入。在我的方法中,我想根據正在使用的類對象使用哪個構造函數來做不同的事情。有沒有辦法做到這一點?有沒有辦法我可以做一個if語句來檢查正在使用的類對象(基於構造函數)的類型?嘗試構建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已被使用,並基於此做不同的事情。

+0

請張貼一些代碼,向我們展示類和方法的樣子。 – codewarrior 2013-02-13 06:34:53

+0

我已經添加了我想要做的具體示例 – Benny 2013-02-13 06:42:46

回答

1

我想這就是你要找的。

修改您的日期範圍類,以便它可以告訴你它是如何創建:

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類將具有類似於doSomething()的抽象方法,其將由每個繼承的DateRangeDate,DateRangeStringDateRangeInt類提供。然後,你可能甚至不需要在迭代中處理if樹。

我希望這有助於!

0

我不確定您是否可以獲得用於實例化對象的構造函數的類型......但您可以做什麼,是在每種類型的構造函數中設置一個特定的參數,稍後您會檢查它。例如,你可以爲每個構造函數設置一個布爾變量(全部初始爲false)。如果調用某個構造函數,則將其各自的變量設置爲true。或者,爲每個構造函數設置一個整數字段爲特定的數字,然後檢查該字段的值。

+0

好主意。除了直接解決問題的任何其他答案外,這就是我要做的。 – Benny 2013-02-13 06:37:11

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; 
     } 
    } 
}