2016-08-15 70 views
0

我有下面的方法,其中傳遞給方法的參數根據作爲第一個參數傳遞的ENUM的值而變化。當參數根據第一個參數變化時處理方法簽名

public void startReporter(ReportType reportType, long period, Class className) { 
     reportHandler = new ReportHandler(metricRegistry); 
     switch (reportType) { 
      case CONSOLE_REPORTER: 
       reportHandler.startConsoleReport(period); 
       break; 
      case SLF4J_REPORTER: 
       reportHandler.startSLF4JReport(className,period); 
       break; 
      case JMX_REPORTER: 
       reportHandler.startJMXReport(); 
     } 
    } 

正如您所看到的,並非所有傳遞的參數都用於switch語句中的所有情況。解決這種情況的最佳方法是什麼?我不想有3種方法。我只需要用這種方法做到這一點。如果方法的調用者通過查看簽名就可以瞭解這一點,那將是非常好的。

+0

創建將在調用main方法時爲可選參數傳遞'null'的重載。 –

+0

創建超載等同於有3種不同的方法來調用記錄器而不用Enum是不是? – mayooran

+0

不可以。不可以。您的邏輯將仍然封裝在一個方法中(就像現在這樣),重載將只是參數組合的包裝。 –

回答

-1

我想這是這樣做的最短途徑:

  1. 使用包裝類的方法簽名。
    void startReporter(ReportType reportType, Long period, Class className)
  2. 如果沒有參數需要,只需發送null代替
    像。
    startReporter(reportType, period, null);
    startReporter(reportType, null, null);
    startReporter(reprotType, period, className);

此外,如果var period熊未簽署的值可能會傳遞-1代替..

0

的參數傳遞給該方法根據不同,其作爲第一傳遞的所述ENUM的值論據。

我想這是因爲你正在將構造參數與方法調用參數混合在一起。

該枚舉被命名爲ReportType。 A 類型通常是一個類,您傳遞給該方法的參數是特定類型的構造函數參數。我的意思是你隱藏了枚舉後面的類。

看看這個重組代碼,它可能會清楚我的意思:

public void startReporter(ReportType reportType, long period, Class className) { 

    // report handler construction 
    switch (reportType) { 
    case CONSOLE_REPOTER: 
     reportHandler = new ConsoleReportHandler(period); 
     break; 
    case SLF4J_REPORTER: 
     reportHandler = new SLF4JReportHandler(className, period); 
     break; 
    case JMX_REPORTER: 
     reportHandler = new JMXReportHandler(); 
    } 

    // report handler invocation 
    reportHandler.startReport(); 
} 

具體類型通常有不同的構造函數的參數。所以你描述的'問題'並不是一個真正的問題。但是如果你不顯示更多的代碼(尤其是使用該方法的代碼),我無法幫助你重新設計代碼。