这是没有意义的内部传递一个参考,如果该方法已经知道它必须访问的成员。
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