为了概括你的问题,你问的是两种形式:
// local variable form
Foo foo = methodReturningFoo();
Bar bar = methodTakingFoo(foo);
// inlined form
Bar bar = methodTakingFoo(methodReturningFoo());
大多数现代 IDE 都有一个快捷键,可以通过按键在它们之间进行重构:“inline” 和 “extract local variable”。两种重构都存在这一事实表明两者在不同的情况下都是合适的。
内联到单个语句使代码更紧凑,有时更具可读性。您可以看到正在发生的所有事情,而无需阅读以找出变量的设置位置。
这是一个很好的内联候选:
String name = customer.getName();
String greeting = createGreeting(name);
// ... becomes ...
String greeting = createGreeting(customer.getName());
提取局部变量将可能很长的语句变成两个(或更多)更短的语句。它还可以让您重复使用一个值,而不是计算两次。
这是一个示例,我们只是将语句分成更小的块。
String greeting = createGreeting(greetingFactory.get(customer.getTitle()), customer.getName());
// ... becomes ...
Title title = customer.getTitle();
String name = customer.getName();
String greeting = createGreeting(greetingFactory.get(title), name));
...这是一个我们重用计算值的示例。
// doing the work twice
CustomerCategory category = findCategory(totalOrderValues(
customer.getOrders(currentMonth)));
List<Promotion> eligiblePromotions = findEligiblePromotions(totalOrderValues(
customer.getOrders(currentMonth)));
// ... becomes ...
BigInteger totalOrderValues = totalOrderValues(
customer.getOrders(currentMonth))
CustomerCategory category = findCategory(totalOrderValues);
List<Promotion> eligiblePromotions = findEligiblePromotions(totalOrderValues);
一般来说,更喜欢内联版本,直到你看到行太长和太复杂。然后提取一个局部变量(或提取一个方法)以使其更整洁。如果存储一个值以避免重复昂贵的计算是有意义的,那么就这样做。