我有一个方法,我想从同一个类的两个不同的地方调用,在一个方法中,它通常会调用一个对话框,另一个方法调用对话框上有一个禁用字段。
我知道在调用中传递一个标志并在方法内部进行测试有效但有没有更优化的方法呢? 有没有办法在方法内知道调用发生的位置?
编辑:
// 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);
}
这是一个很好的例子吗?
答案 0 :(得分:2)
我认为参数化方法可以完成这项工作。你为什么说这不是最佳的? 有一种方法可以检查调用方法的位置,但由于这很难看,我甚至不想展示如何执行此操作。
答案 1 :(得分:1)
你可以创建一个例外并分析堆栈跟踪,但是你不应该出于两个原因。
传递旗帜是最好的选择 - 它更清洁,更优化,更易于维护。
答案 2 :(得分:1)
最终,您需要进行某种测试以了解是否需要禁用该字段,并测试boolean
值,因此最简单的方法是{{1}就是简单地传递它。任何类型,基元,对象等的参数传递都相对便宜,所以性能明智,这没有任何问题。
在设计方面,使用参数是有意义的,因为这确实是boolean
值的目的,表明做一件事或另一件事是真是假。
你提出的任何其他解决方案都将是令人讨厌或缓慢的(我正在看着你,boolean
人)并且会要求你测试一些价值,但你必须首先计算该值,这需要时间。
如果确实不想传递参数,那么也许你可以在对象中使用某种状态来决定这一点,但最终只能是Thread.currentThread().getStackTrace()
字段而不是boolean
参数,所以真的,你只是在做同样的事情。另外,如果您在任何类型的并发系统中运行该代码,那么您将不得不添加同步,这会进一步增加您可以通过将其作为参数传递而避免的代码复杂性。
我想,长话短说,只需使用一个参数。它是明智的,可读的,任何阅读代码的人都会立即明白你的所作所为。不要在你的代码中做一些含糊不清,会妨碍可读性的事情,等等,因为它会“做一些很酷的事情”,比如make,所以你不必传递参数。可以这样想:如果有人想用你添加的方法之外的其他方法调用该方法,他们需要多长时间才能弄清楚如何调用它?
编辑:另一个选项是重载。您可以提供一些常见的默认值方法和一个带参数的方法。如果您发现比禁用该字段更频繁地启用该字段:
boolean
然后打开启用它的对话框的所有地方都会调用第一个方法(或第二个方法public void showDialog() {
showDialog(true);
}
public void showDialog(boolean fieldEnabled) {
// Show the dialog
}
),而那些希望它被禁用的方法会调用第二个方法并且必须通过{{1} }。
答案 3 :(得分:0)
即调用方法重载
相同方法不同的参数
使用变量数参数重载搜索方法,