繁体   English   中英

进一步方法的范围

[英]Scope of further methods

在讨论Java编程时,我最近学到了更多关于变量作用域和声明的知识,更具体地说, 应该在尽可能最低的范围内声明变量。 这让我想到了以下示例,其中我们创建了一个新对象并将其发送到另一个函数:

method  {
  while(statement) {
    Object newObject;
    //method code

    if(statement) {
      newObject = new object();
    } else {
      newObject = new object();
    }
    otherMethod(newObject)
  }
}

与此示例相比:

method  {
  while(statement) {
    Object newObject;
    //method code

    if(statement) {
      Object newObject;
      newObject = new object();
      otherMethod( newObject );
    } else {
      Object newObject;
      newObject = new object();
      otherMethod( newObject );
    }
  }
}

哪一个更正确?

您的第一个示例使用较少的代码,通常是首选。 Java将阻止您使用可能尚未初始化的变量,因此可读性不会受到太大影响。

对于更清晰的代码,您应该使用条件运算符:

otherMethod(condition? new ObjectA() : new ObjectB());

我更喜欢第一种方法。 它更灵活,更易于阅读。 if语句的职责是创建对象。 您可以通过多种方式执行此操作,并为if或else分支添加其他逻辑,并且您在概念上知道,一旦if完成,就会创建Object并准备就绪。 由于该方法位于if之后,因此您知道它将始终被调用。 由于它更好地显示了责任分工,这就是我更喜欢的方法。

我更喜欢第一个,只要你做的事情(例如用新实例调用其他方法)总是相同的,无论if的方式如何。

作为旁注,如果您有“//方法代码”,实际上有很多代码,那么我建议在if语句之前将变量声明向下移动到右边。 这样你就可以让声明尽可能接近开始使用的地方。

其他人指出,第一个更清晰,可能通常是首选。 有一些观点的空间,但我希望你会发现大多数人会更喜欢这个。 但是,如果你试图将事情保持在必要的范围内,我建议你实际上将对象的构造重构为工厂方法,以便一切都更清晰。 代替:

public void frobSomeBars() {
  while ( condition1 ) {
    final Bar bar;
    if ( condition2 ) {
      bar = makeBarType1();
    } else {
      bar = makeBarType2();
    }
    frob( bar );
}

你可以写一个Bar工厂方法:

public Bar makeBar( final boolean condition ) {
  if ( condition ) {
    return makeBarType1();
  }
  else { 
    return makeBarType2();
  }
}

注意:我通常更喜欢使用执行路径树来创建方法,每个叶子都在一个返回中终止。 有些人会更喜欢单个返回点,并将工厂方法写为:

public Bar makeBar( final boolean condition ) { 
  final Bar bar;
  if ( condition ) {
    bar = makeBarType1();
  }
  else { 
    bar = makeBarType2();
  }
  return bar;
}

然后frobSomeBars有点简单:

public void frobSomeBars() {
  while ( condition1 ) {
    final Bar bar = makeBar( condition2 );
    frob( bar );
}

甚至:

public void frobSomeBars() {
  while ( condition1 ) {
    frob( makeBar( condition2 ));
}

变量应在尽可能最低的范围内声明。

我相信你所做的是微观优化。

哪一个更正确?

我并不是说写任何东西, JVM都会维护。在这种情况下我建议你,不要再进一步坚持第一种方法,它更清洁,更具可读性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM