首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更改引用或返回引用

更改引用或返回引用
EN

Stack Overflow用户
提问于 2014-04-07 16:12:23
回答 6查看 56关注 0票数 0

这是什么意思?最容易通过代码显示

代码语言:javascript
复制
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引用进行简单的递增)。

EN

Stack Overflow用户

发布于 2014-04-07 16:16:39

我更喜欢methodA,因为很明显您将修改我提供的参数。

我发现methodB目前的形式具有误导性,因为我假设参数不会被修改,而实际上它会被修改。您可以随时编辑代码以删除此误导性行为:

代码语言:javascript
复制
public static Date methodB(Date d) {
  Date result = d.clone();
  result.setMonth(6);
  return result;
}

在某种程度上,methodB允许方法链接,但是返回的对象是参数本身的情况并不常见。更常见的情况是,返回的对象与您在其上调用该方法的类相同:

代码语言:javascript
复制
public class DateManipulator {

  public DateManipulator(Date d) {
    // store d
  }

  public static DateManipulator methodB() {
    d.setMonth(6);
    return this;
  }

  public static Date build() {
    return d;
  }
}

它允许构造:

代码语言:javascript
复制
new DateManipulator(d).methodB().methodC()....build();
票数 3
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22906907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档