Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 参数根据第一个参数变化时的处理方法签名_Java_Oop_Design Patterns_Methods_Signature - Fatal编程技术网

Java 参数根据第一个参数变化时的处理方法签名

Java 参数根据第一个参数变化时的处理方法签名,java,oop,design-patterns,methods,signature,Java,Oop,Design Patterns,Methods,Signature,我有下面的方法,其中要传递给该方法的参数根据作为第一个参数传递的枚举值而变化 public void startReporter(ReportType reportType, long period, Class className) { reportHandler = new ReportHandler(metricRegistry); switch (reportType) { case CONSOLE_REPORTER:

我有下面的方法,其中要传递给该方法的参数根据作为第一个参数传递的枚举值而变化

 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语句的所有情况下使用。解决这种情况的最佳方法是什么?我不想有三种方法。我只需要用这个方法。如果该方法的调用方只需查看签名就可以知道这一点,那将是非常棒的。

我想这是实现这一点的最短方法:

在方法签名中使用包装器类。 void startReporterReportType报告类型,长周期,类类名 如果不需要参数,只需发送null即可 喜欢 startReporterreportType,句点,空; startReporterreportType,null,null; StartReporterProtType、句点、类名; 此外,如果var期间具有未签名的值,则可以改为传递-1

要传递给方法的参数根据作为第一个参数传递的枚举值而变化

 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();
        }
    }
我猜这是因为您将构造参数与方法调用参数混合在一起

枚举名为ReportType。类型通常是一个类,传递给方法的参数是特定类型的构造函数参数。我的意思是你在枚举后面隐藏类

看看这段经过重组的代码,我的意思可能很清楚:

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

具体类型通常有不同的构造函数参数。所以你所描述的“问题”其实不是问题。但是如果你不给我看更多的代码,特别是使用该方法的代码,我就无法帮助你重新设计代码。

创建重载,在调用main方法时为可选参数传递null。创建重载等于有3种不同的方法调用报告器,而不使用枚举,不是吗?不。你的逻辑将是现在仍然封装在一个方法中,重载将只是参数组合的包装。当有人使用reportType=JMX_REPORTER调用“startReporter”时,方法调用会是什么样子。是startReporterReportType.JMX_REPORTER,null,null??有些东西闻起来不太对劲。reportHandler在调用start…后立即超出范围。。。。方法ReportHandler对象是否真的短暂且不需要?或者,它是否有一些静态副作用?