从方法返回值时,是否有一种“null”成员变量的好方法?

时间:2014-02-18 18:50:19

标签: java

我有一些看起来像这样的代码,以确保Foo不成立 参考它不再需要:

class Foo {
  T field;

  T method()
  {

     ....

     T tmp = field;
     field = null;
     return tmp;
  }
}

这看起来很难看。有没有更好的方式来取出垃圾?

3 个答案:

答案 0 :(得分:1)

使用try-finally块

class Foo {
  T field;

  T method()
  {
     ....
     try {
       ....
       return field;
     } finally {
       field = null;
     }
  }
}

答案 1 :(得分:1)

  

有没有更好的方式来取出垃圾?

简短的回答是否定的。

您可以使用反射做一些事情(例如,将字段的名称作为参数等的辅助方法),允许您在一行中表示方法体。但那并不是我所说的愉快。

答案 2 :(得分:1)

某些setter方法返回正在设置的东西的先前值。例如,Map.put(key,value)返回与密钥关联的先前值。您可以使用该习惯用法来完成您的方法:

return setField( null );

将字段设置为null,并返回其(先前)值。这当然有点短:它将三条线变成一条线(代价是将它们移到其他地方,但这并不是一个问题)。但是,这是否更清楚取决于您的代码库是否充分利用了“返回先前值”的习惯用法。如果您没有在其他地方使用它,那么这段代码不是很清楚(当然,您可以添加注释)。如果你在这里使用这个成语,并且你在其他地方使用“返回新值”的习惯用法(例如,用于方法链接),那么这将变得非常不透明。

除了那些清晰的问题之外,还值得注意的是,这确实违反了作为void方法的setter的典型约定和JavaBeans“协议”。如果你有很多这样的领域,它也会变得有点毛茸茸,因为你开始需要这样一个方法。

您的代码将是这样的:

class Foo {
  T field;

  T method() {
     ....
     return setField( null );
  }

  T setField( T value ) {
    T old = field;
    field = value;
    return old;
  }
}