3

在讨论 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 );
    }
  }
}

哪一个更正确?

4

5 回答 5

2

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

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

otherMethod(condition? new ObjectA() : new ObjectB());
于 2013-09-18T13:56:00.533 回答
2

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

于 2013-09-18T13:57:36.573 回答
1

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

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

于 2013-09-18T14:23:33.730 回答
1

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

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 ));
}
于 2013-09-18T14:24:55.543 回答
0

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

我相信您正在做的事情属于微优化。

哪一个更正确?

我不是说写什么,JVM就会维护。在这种情况下,我建议你不要走得太远,坚持第一种方法,更干净,更易读。

于 2013-09-18T13:58:33.363 回答