2016-08-15 25 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(); 
} 

具体类型通常有不同的构造函数的参数。所以你描述的'问题'并不是一个真正的问题。但是如果你不显示更多的代码(尤其是使用该方法的代码),我无法帮助你重新设计代码。