2014-07-25 6 views
-3

나는 그들이 조작 할 몇 가지 방법으로 전달해야하는 세 가지 목적이 있습니다 다른 조작들 사이에서 포함을 다시 인스턴스화 할 수여러 개체를 다시 설정하는 가장 좋은 방법은 무엇입니까?

List<Double[]> listD; 
List<String[]> listS; 
Map<String, String> map; 

논리의 그 부분을 감안를, 그들을 포장하는 것이 좋습니다 새 클래스에서 매개 변수로 전달하지 않고 다시 인스턴스화해야 할 때 clear()을 호출하면됩니까?

"답변 할 수있는 질문"보다는 "논의 할 수있는 질문"이 될 수 있으므로 일반적으로 허용되는 최선의 방법을 묻습니다.

+0

, 항상 함께 통과, 항상 등을 함께 삭제 다음은 클래스를 캡슐화하는 의미가 있습니다 :

지금 당신은 이런 식으로 뭔가를 호출 할 수 있습니다. –

+1

왜 매개 변수로 전달하지 않고 메서드에서 조작 한 결과를 반환합니까? –

+0

메소드에서 객체를 다시 인스턴스화 할 때는 java가 [값을 통한 전달]임을 기억하십시오 (http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value). 목록과 맵으로 만 작업하는 경우 clear() 및 remove() 메서드를 사용하여 "실제"객체에 영향을주는 것이 더 좋습니다. – Narmer

답변

0

re-instantiation 가능성이있는 래퍼는 뚜렷한 장점이 있습니다. 수정할 수없는 목록을 전달할 수 있습니다.

List<Double[]> myListD = Collections.unmodifiableList(getListD()); 
ArgWrapper wrapper = new ArgWrapper(); 
wrapper.setListD(myListD); 
myMethod1(wrapper); 

myMethod1listD에 새 목록을 설정할 수 있습니다 : 다른 말로하면, 당신은이 작업을 수행 할 수 있습니다.

// The call below will break when myMethod2 calls clear on myList 
myMethod2(myListD, myListS, myMap); 

또한, 목록이 경우 다른 소스에서 귀하의 방법, clear()를 호출을 기반으로하는 방법을 통과 : 당신은 목록에 clear()를 호출 할 수있는 능력을 기대하는 방법에 myListD를 전달할 수 없습니다 누군가 elses 공유 목록을 정리할 위험이 있습니다.

0

Java가 메소드 호출간에 매개 변수를 전달하는 방법에주의해야합니다.

이있는 경우 : 자바는 pass by value하고 원래의 목록은 영향을받지 않기 때문에

public void clearLists(List<Double[]> listD, List<String[]> listS){ 
    listD = new ArrayList<Double[]>(); 
    listS = new ArrayList<String[]>(); 
}; 

가 작동하지 않습니다 :

List<Double[]> listD = new ArrayList<Double[]>(); 
List<String[]> listS = new ArrayList<String[]>(); 
//fill the lists 
clearLists(listD, listS); 

방법을 호출. 이 특정 경우에는 List#clear()을 사용하여 모든 목록 내용을 올바르게 제거 할 수 있습니다. 하지만 컬렉션에만 작동합니다 ...

모범 사례 IMO (및 기타 응답자)는 필요한 목록 또는 wathewer에 대한 래퍼가 있어야합니다. 전화를 당신이 목록을 필요로 할 때 당신이 (한 번에 또는 하나)으로 재설정 할 필요가있을 때

public class Wrapper{ 
    List<Double[]> listD = new ArrayList<Double[]>(); 
    List<String[]> listS = new ArrayList<String[]>(); 
    MyObject obj = new MyObjectImpl(); 

    public Wrapper(); 
    public List<Double[]> getListD() { 
     return listD; 
    } 
    public void setListD(List<Double[]> listD) { 
     this.listD = listD; 
    } 
    public List<String[]> getListS() { 
     return listS; 
    } 
    public void setListS(List<String[]> listS) { 
     this.listS = listS; 
    } 
    public MyObject getObj() { 
     return obj; 
    } 
    public void setObj(MyObject obj) { 
     this.obj = obj; 
    } 
    public void resetList(){ 
     this.listS = new ArrayList<String[]>(); 
     this.listD = new ArrayList<Double[]>(); 
     this.obj = new MyObjectImpl(); 
     //OR 
     //this.listS.clear(); 
     //this.listD.clear(); 
    } 
} 

당신이 get 메소드를 호출에만이 래퍼의 인스턴스를 만들 수있는 IT 콘텐츠입니다 얻기 위해 주위를 통과 해당 메소드. 세 가지 컬렉션이 밀접하게 관련되어있는 경우

Wrapper wrap = new Wrapper(); 

clearLists(wrap); 

public void clearLists(Wrapper wrap){ 
    wrap.resetLists(); //Safe! we are changing the content, not the reference. 
} 
+0

감사합니다. Java가 가치에 의해 전달된다는 것을 알고 있습니다. 그래서 내가 clear()를 호출 할 것이라고했습니다. – user3748908