0

我有一个方法,我想从同一个类的两个不同位置调用,其中一个正常调用对话框,另一个调用带有一个禁用字段的对话框。

我知道在调用中传递一个标志并在方法内进行测试是可行的,但是有没有更优化的方法呢?有没有办法在方法内部知道调用发生在哪里?

编辑:

   // The part where you call the method passing a flag.
   showItemCustomDialog(true);
   showItemCustomDialog(false);

   // The dialog
   public void showItemCustomDialog(boolean flag) { 
       customDialog = new Dialog(this));
       field.setEnabled(flag);
   }

这是一个很好的例子吗?

4

4 回答 4

2

我认为参数化方法可以完成这项工作。为什么说它不是最优的?有一种方法可以检查从哪里调用方法,但是由于这太丑陋了,我什至不想展示如何做到这一点。

于 2012-09-26T14:42:33.807 回答
1

您可以创建异常并分析堆栈跟踪,但您不应该这样做,原因有两个。

  1. 异常在计算上是昂贵的。
  2. 它违反了方法的一般 java 概念。您没有创建任何人都可以调用的方法,而是创建了一个只能在少数几个地方工作的方法。从长远来看这是一场噩梦,从短期来看是丑陋的。

传递标志是最好的选择——它更干净、更优化和更易于维护。

于 2012-09-26T14:51:33.243 回答
1

最终,您将需要进行某种测试以了解是否需要禁用该字段,并对boolean值进行测试,因此最简单的方法boolean就是简单地通过它。任何类型的参数传递,原语,对象等,都是相对便宜的,所以性能方面,这没有任何问题。

在设计方面,使用参数是有意义的,因为这确实是一个boolean值的目的,指示做一件事或另一件事是真还是假。

您提出的任何其他解决方案都将是令人讨厌或缓慢的(我在看着您,Thread.currentThread().getStackTrace()人们)并且将要求您测试一些值,但是您必须首先计算该值,这需要时间.

如果您真的不想传递参数,那么也许您可以使用对象中的某种状态来决定这一点,但最终这将只是一个boolean字段而不是boolean参数,所以实际上,您只是在做一样。另外,如果您在任何类型的并发系统中运行该代码,那么您将不得不添加同步,这只会进一步增加您可以通过将其作为参数传递来避免的代码复杂性。

我想,长话短说,只需使用一个参数。它是明智的、可读的,任何阅读你的代码的人都会立即明白你做了什么。不要在你的代码中做一些模糊的事情,这会妨碍可读性等等,只是因为它会“做一些很酷的事情”,比如 make 它,所以你不必传递参数。可以这样想:如果有人想从您添加的方法之外的其他方法中调用该方法,他们需要多长时间才能弄清楚如何调用它?

编辑:另一种选择是重载。您可以提供一些常用的默认值方法和带参数的方法。如果您发现启用该字段的频率高于禁用该字段的频率:

public void showDialog() {
    showDialog(true);
}

public void showDialog(boolean fieldEnabled) {
    // Show the dialog
}

然后在启用它的情况下打开对话框的任何地方都将调用第一个方法(或第二个方法true),并且希望它被禁用的那些调用第二个方法并且必须通过false

于 2012-09-26T14:55:06.983 回答
0

那就是调用方法重载

相同方法不同参数

带有可变数字参数的搜索方法重载,

于 2012-09-26T14:51:26.470 回答