2016-03-31 83 views
0

我有一个方法,我传递了几个日历对象的类。在该方法中,我将几天/几个月添加到日历对象。Java日历通过引用传递?

但是,在返回方法时,传递的Calendar对象不再保存执行'处理'的方法的更新日期。

我会想到与日历对象,更改将保持不管id改变状态?下面的代码:

Calendar aDate = Calendar.getInstance(); 
aDate.set(2016, 2, 30); 

Calendar start = Calendar.getInstance(); 

myClass.setStartAndEnd(aDate, start); 

然后setStartAndEnd方法...

void setStartAndEnd(Calendar aDate, Calendar start) { 

    if (aDate.get(Calendar.DAY_OF_WEEK) == 1) { 
     start = aDate; 
    } else { 
     start.add(Calendar.DAY_OF_WEEK, 5); 
    } 
} 

在这种情况下,我希望“开始”与添加到3月30日5天至结束,但在返回方法它最终还是因为3月30日

+2

引用传递值 – Andrew

+0

@AndrewTobilko一个'Calendar'(不幸)是可变的,因此在'start'上调用'.add()'确实会修改底层对象。但是否则,是的,Java只是通过价值。 – fge

+0

@fge,OP只改变了局部变量('start = aDate;'),而不是传入的对象 – Andrew

回答

2

你做两件不同的事情:

if (aDate.get(Calendar.DAY_OF_WEEK) == 1) { 
    start = aDate;  

- 截至本,你重新分配本地start参考aDate,所以本地start从现在的点不是start作为参数传递,而是aDate。在该方法中,start未被重新分配,因为对它的引用是按值传递的;

} else { 
    start.add(Calendar.DAY_OF_WEEK, 5); 

- 截至本,修改本地start,这仍然指向start作为参数传递,因此,所有的变化都体现在对象该方法也。

摆脱情况下,当参数被错误地重新分配,使他们final

void setStartAndEnd(final Calendar aDate, final Calendar start) { 
    // ... 
} 
+1

关于使参数最终成为一个很好的观点。这是我们真正钻进我们实习生中的一件事。它立即消除了一整类错误。 – KevinO

0

由于@fge指出,日历对象是可变的。因此,当start对象传递给setStartAndEnd方法时,可以通过诸如start.add()等方法来修改对象。因此,有两种方法可以修复代码。

选项1.在setStartAndEnd中,不要设置start变量(即本地)结束,但使用方法来调整其值。

void setStartAndEnd(Calendar aDate, Calendar start) { 

if (aDate.get(Calendar.DAY_OF_WEEK) == 1) { 
    start.setTime(aDate.getTime()); 
} else { 
    start.add(Calendar.DAY_OF_WEEK, 5); 
} 

}

选项2变化返回日历对象,并用正确的值返回一个新的日历对象的方法。