这是什么意思?最容易通过代码显示
import java.util.Date;
public class Example {
public static void main(String... args) {
Date d1 = new Date(2014,4,7);
Date d2 = new Date(2014,4,7);
methodA(d1);
System.out.println("Month of d1: " +d1.getMonth());
d2 = methodB(d2);
System.out.println("Month of d2: " +d2.getMonth());
}
public static void methodA(Date d) {
d.setMonth(6);
}
public static Date methodB(Date d) {
d.setMonth(6);
return d;
}
}首先,忽略过时的日期代码。当谈到诸如Date这样的可变对象时,是像methodB中那样进行更改并返回引用更好,还是使用methodA的方法可以?
我怀疑大多数人都会选择methodB,但为什么呢?
注意:只有在使用可变对象时,methodA才具有与methodB相同的结果。例如,交换Integer的日期,在调用methodA之后,第一个对象的值将保持不变(假设methodA和methodB都会对相同值的两个Integer引用进行简单的递增)。
发布于 2014-04-07 16:16:39
我更喜欢methodA,因为很明显您将修改我提供的参数。
我发现methodB目前的形式具有误导性,因为我假设参数不会被修改,而实际上它会被修改。您可以随时编辑代码以删除此误导性行为:
public static Date methodB(Date d) {
Date result = d.clone();
result.setMonth(6);
return result;
}在某种程度上,methodB允许方法链接,但是返回的对象是参数本身的情况并不常见。更常见的情况是,返回的对象与您在其上调用该方法的类相同:
public class DateManipulator {
public DateManipulator(Date d) {
// store d
}
public static DateManipulator methodB() {
d.setMonth(6);
return this;
}
public static Date build() {
return d;
}
}它允许构造:
new DateManipulator(d).methodB().methodC()....build();发布于 2014-04-07 16:18:07
大多数人会喜欢选项2,因为它支持链接
Example.methodB(...).someThing()但是,如果方法可以返回一些其他信息(一个常见的示例是返回一个指示方法成功或失败的布尔值),则应不惜一切代价避免这种情况。
常见的例子是StringBuilder类。StringBuilder.append()返回一个StringBuilder (this),因此您可以链接append()命令。
请注意,此方法通常用于调用对象(如StringBuilder示例),但参数变量也完全适用。
发布于 2014-04-07 16:19:02
一般来说,我更喜欢methodA,因为我会考虑返回另一个对象,这意味着原始对象没有被修改。所有的String处理方法都是示例。
但是,在某些特殊情况下,例如构建器模式,methodB是如何工作的很清楚,并且您可以获得可以链接调用的优势。可以期望消费者知道构建器模式,因此methodB在这种情况下不会产生误导。
https://stackoverflow.com/questions/22906907
复制相似问题