类方法体遇到return语句之后,除非偶finally代码,否则都将返回,所以以上代码,如果some_conndition条件成立的话,效果一样,否则第一种方法会直接跳出代码块返回,而第二种将跳入第二个代码块然后返回

解决方案 »

  1.   

    为追求效率到做这样的分析,实在是有点....有点...变态了(不好意思哦:)我想楼上说的挺有道理的,不过具体的实现可能还要和具体的编译器有关的(或许还和编译选项有关)。要知道有时候优化编译会彻底打乱我们认为的正常顺序,比如在win32下写真正追求效率的代码时是把编译器的优化选项关闭的!话说回来,要追求效率不要从这种角度来,这样是钻牛角尖了对于这两种写法我的认为是上面的好。我是从源代码的角度来看的。当我一眼看到第二个代码的时候,我觉得这段代码有问题,因为我没有在最后看到有return,而函数明显要返回一个String。后来仔细一看原来函数体内就两个出口。一般来说实际代码比这个复杂多了,如果里面的if很复杂,外加while-break的话,有时候到底会从哪里出来很难讲,多个出口容易造成有漏掉的发生,也就是有能出去的地方(其实可能性就是最后一句了,因为里面要出去的话都直接return了)漏掉返回值。而如果函数是void的话,往往我们会省略不写的,所以在有返回的时候造成了一些错误的发生。当然这些错误在编译的时候是明显不能过语法检查的,所以马上可以找到再改回来。但我想说的是这是个写代码的习惯问题。所以相比第一种代码,个人认为第二种的代码质量没第一种好。(代码质量是很重要的,不为了追求这个,就不必要有C++了,什么类啊,模板啊,都asm算了)(但要说明,要是强行在II的最后加上return,编译器反而会告诉你有无法执行的语句,不过就现在的情况是不可能的,因为强行return,return什么呢?在这里是没这种可能的)
      

  2.   

    同意楼上第一个观点,考虑这个问题,不因该单纯的考虑效率问题,因为两者的区别基本可以忽略不计。
    但是对于第二个观点我有些看法,正如楼上说的,实际应用中实际代码比这个复杂多,,在else里面不可能只是简单的返回一个值,可能还要做一定的处理,如果采用第一种方式可能代码是这样的:
      if(some_conndition){
        doSomeThing;
        doSomeThing;
        ...
        return "a";
      }
      doOtherThing;
      doOtherThing;
      ...
      return "b";这样写,显然不容易看出doSomeThing;与doOtherThing;是并列关系,可读性差,所以我赞成使用第二种方式
      

  3.   

    还有种做法是:
    public String someMethod()
    {
      String returnVal = new String();//是这样还是给个null???
      if(some_conndition){
        returnVal = "a";
      }
      return returnVal;
    }即使有else也可以设置不同值,这样就不会有多个出口的问题了,
    从安全上来说这样好多了吧,呵呵
    但在很简单的方法(比如就一两行)中这样做显的有点“庞大”呵呵
      

  4.   

    if/else的效率方面一般是有了循环才考虑.
      

  5.   

    谢谢楼楼上的提醒,最近确实也发现这个问题,考虑的太多了,呵呵:)努力改变中:)谢谢again!