這是沒有意義的內部傳遞一個參考,如果該方法已經知道它必須訪問的成員。
class FooHolder {
private Foo foo;
private void ensureInitialized() {
if (foo == null)
foo = new Foo();
}
public Foo getFoo() {
ensureInitialized();
return foo;
}
}
但是,如果您可以通過這種方式防止代碼重複,那麼這樣做有時候很有用。這些內部實用方法有時可能是靜態喜歡這裏:
class FooAndBar {
private List<Foo> foos;
private List<Bar> bars;
public void addFoo(Foo foo) {
foos = ensureList(foos);
foos.add(foo);
}
public void addBar(Bar bar) {
bars = ensureList(bars);
bars.add(bar);
}
// assume this method is not generically useful and therefore not better off in a utility class
private static <T> List<T> ensureList(List<T> list) {
return list != null ? list : new ArrayList<T>();
}
}
有時他們不能/不應該
class FooFoos {
private final Map<String, List<Foo>> fooMap = new HashMap<String, List<Foo>>();
private List<Foo> getListForKey(String key) {
List<Foo> list = fooMap.get(key);
if (list == null) {
list = new ArrayList<Foo>();
fooMap.put(key, list);
}
return list;
}
public void addFoo(String key, Foo foo) {
getListForKey(key).add(foo);
}
public List<Foo> getList(String key) {
return getListForKey(key);
}
}
注意getListForKey
不通過一個參考fooMap
。沒有必要,因爲那部分已經很清楚了,並且在每種方法中輸入它只會混淆代碼。
如果您可以通過這種方式實現更少的代碼重複和某些內部封裝,請將引用傳遞給您的私有方法。但是如果這會導致更多的代碼,那麼不要這樣做,因爲每個方法都必須重新指定引用。
另請注意,通過方法進行的大量功能內部封裝意味着您應該考慮將該功能重構爲另一個類。對於最後一個例子,考慮使用/創建類似MultiMap
如果在函數中更改它,第一個數據會保持不變,第二個更改原始數據。所以這取決於你想要什麼。 – Tdelang
@Tdelang如果不重新分配'data1',則第二種方法不一定會更改'data1'。 – Thomas
對不起,我可能不清楚,「如果你改變它在你的功能」我的意思是重新分配它。 – Tdelang