그것은 방법은 이미 액세스 할 수있는 회원을 알고 있다면 내부적으로 참조를 전달하는 말도 안돼을 제공 할 수있다.
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>();
}
}
그들이 할 수없는/getListForKey
는 fooMap
에 대한 참조를 전달되지 않습니다 것을
가
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);
}
}
참고해서는 안됩니다. 그 부분이 이미 명확하고 모든 메소드에서 타이핑하면 코드가 복잡해지기 때문에 불필요하지 않습니다.
코드 중복을 줄이고 내부 캡슐화를 수행 할 수 있다면 개인 메서드에 대한 참조를 전달하십시오. 모든 메소드가 참조를 다시 지정해야하기 때문에 더 많은 코드가 생성된다면 그렇게하지 마십시오.
메소드를 통한 기능의 내부 캡슐화가 많다는 것은 해당 기능을 다른 클래스로 리팩토링하는 것을 고려해야한다는 것을 의미합니다.마지막 예제는 다음과 같이 작성/사용하는 것을 고려하십시오. MultiMap
첫 번째는 함수에서 변경하면 data1이 그대로 유지되고 두 번째는 원본을 변경합니다. 그래서 그것은 당신이 원하는 것에 달려 있습니다. – Tdelang
@Tdelang 두 번째 방법은'data1'을 재 할당하지 않으면 반드시'data1'을 변경할 필요가 없습니다. – Thomas
죄송합니다. 아마도 "기능을 변경 한 경우"로 다시 지정하는 것이 좋습니다. – Tdelang