有 Java 编程相关的问题?

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

java是组合函数的最专业的方式

我正在学习Java课程,有一个关于专业性和效率的问题。我已经读到最好不要创建临时变量

我已正确回答其中一个测验问题,如下所示:

public void removeLowest(){

    remove(find(lowScore())); //doesn't really read very easily
}

答案将每一步分解如下:

public void removeLowest(){

    double low = lowScore();
    int lowScoreIndex = find(low);
    remove(lowScoreIndex);
}

两个版本完成相同的任务,但哪一个更好

谢谢


共 (4) 个答案

  1. # 1 楼答案

    这是一个很难回答的问题,因为两种观点都有自己的观点。然而,如果我们看一下每一个的字节码:

    去除最低no中间产物

      public void removeLowest();
        Code:
           0: aload_0       
           1: aload_0       
           2: aload_0       
           3: invokespecial #2                  // Method lowScore:()D
           6: invokespecial #3                  // Method find:(D)I
           9: invokespecial #4                  // Method remove:(I)V
          12: return 
    

    中间产物含量最低

      public void removeLowest2();
    Code:
       0: aload_0       
       1: invokespecial #2                  // Method lowScore:()D
       4: dstore_1      
       5: aload_0       
       6: dload_1       
       7: invokespecial #3                  // Method find:(D)I
      10: istore_3      
      11: aload_0       
      12: iload_3       
      13: invokespecial #4                  // Method remove:(I)V
      16: return 
    

    所以你可以看到中间产物确实需要更多的操作和存储。然而,请记住JVM是智能的,所以在运行时它可能会对字节码进行优化。有可能的是,如果您多次调用它,它会将所有方法内联到同一个块中,并删除本地存储

    就你的问题而言,我更倾向于可读性,而不是以易读性为代价编写更紧凑的代码。这纯粹是因为你的代码->;字节码->;在优化这段代码时会发生很多事情,所以您主要关心的是编写尽可能多的可维护代码。正如其他人所提到的,在更大的范围内,代表意义的几个中间存储值的成本非常低

  2. # 2 楼答案

    对于变量名直观的一小部分语句,即使是第一个代码示例也很好。在第二种情况下,代码更详细,更容易理解。(不说冗长==理解)

    Efficiency:至少在这种情况下,你不需要太担心它。Jim正确地指出,JVM比我们假设的更智能,可以根据需要进行优化。另外,只要把变量/对象放在正确的范围内,就不用太担心空间。(方法、类、实例)。请记住,当我们说java程序时,我们谈论的是managed code,所以如果您支持1号以获得更高的效率,我会说它不会产生太大影响

    Professionalism:第二个例子(作为实践演示者)更受欢迎,还有一个方面,maintainability。类似的用法可能会出现。(*可维护性不仅取决于此) 有些语言不那么冗长,但仍然适用于大型代码库

  3. # 3 楼答案

    就速度效率而言,两者是相同的。然而,第一种方法节省了一些内存,而不是分配内存来将返回的值存储在堆栈中。一般来说,在这种情况下,人们不必担心使用堆栈内存,原因有二。首先,堆栈是灵活的,可以存储大量的临时数据。第二,对于以后的代码审查,为函数的返回值指定一个名称,使代码对作者和其他修改代码的人更具可读性

  4. # 4 楼答案

    你说得对——他们都做同样的事! 但是,唯一的区别是,通过创建变量,还可以创建运行该方法的线程所拥有的LocalVariableReference。这引用了内部方法(例如getLow())返回的返回值。这意味着通过为返回值声明变量来命名返回值需要更多内存。 尽管如此,它使代码更容易阅读,而且老实说,占用的空间非常小,可以忽略! (这只是对一个值的引用——获取的数据非常小)

    一句话:做一些对你来说更容易阅读和调试的事情