如果方法已经知道它必须访问的成员,那么在内部传递引用是没有意义的。
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的东西