有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

不使用标志的java方法调用

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

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

编辑:

   // 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) 个答案

  1. # 1 楼答案

    这就是调用方法重载

    相同的方法不同的参数

    使用可变数字参数重载搜索方法

  2. # 2 楼答案

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

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

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

  3. # 3 楼答案

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

    就设计而言,使用参数是有意义的,因为这确实是boolean值的目的,用于指示做一件事或做另一件事,不管它是真是假

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

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

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

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

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

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

  4. # 4 楼答案

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