我有一些看起来像这样的代码,以确保Foo不成立 参考它不再需要:
class Foo {
T field;
T method()
{
....
T tmp = field;
field = null;
return tmp;
}
}
这看起来很难看。有没有更好的方式来取出垃圾?
答案 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;
}
}