2013-08-05 2 views
2

내 일반적인 질문은 생성자에 대한 인수를 전달할 때와 클래스의 메소드에 전달할 때입니다. 일반적으로 객체는 "데이터"+ "데이터에서 작동하는 메소드"입니다.생성자를 사용할 때와 인수를 전달할 때

DFS라는 클래스를 디자인하기위한 몇 가지 옵션이 있습니다. 다음 중 스위트 디플로 이닝이 가장 좋은 예는?

옵션 1 : 그래프가 생성자에서 전달되었으며 함수의 소스. Adv : 동일한 DFS 개체가 다른 원본과 함께 다시 사용됩니다.

public class DFS { 
    Graph g; 
    public DFS(Graph g) { 
    this.g = g; 
    } 

    public void doDfs(int source) { 
    // dfs computation 
    } 
} 

옵션 2 : 새로운 객체가 구축 될 필요가 각각의 새로운 소스 : 2 PARAMS없이 다형성 Disadv와 생성자입니다.

public class DFS { 
    Graph g; 
    int source; 

    public DFS(Graph g, int source) { 
     this.g = g; 
     this.source = source; 
    } 

    public void doDfs() { 
     // dfs computation 
    } 
} 

옵션 3 : 과부하 생성자 교수실 : 모든 유스 케이스를 해결한다. Dis : 다형성에 많은 비용이 듭니다.

public class DFS { 
    Graph g; 
    int source; 

    public DFS(Graph g) { 
    this.g = g; 
    } 

    public DFS(Graph g, int source) { 
    this.g = g; 
    this.source = source; 
    } 

    public void doDfs() { 
     doDfs(source); 
    } 

    public void doDfs(int source) { 
    // dfs computation 
    } 
} 

옵션 4 : 당신이 클래스의 작업/정의와 관련된 뭔가를 할 때 생성자

public class DFS { 

    DFS() { } 

    public void doDFS(Graph g, int source) { 
     this.g = g; 
     this.source = source; 
     // dfs computation 
    } 
} 
+0

http://stackoverflow.com/questions/18027135 –

+0

"다형성"이란 무엇을 의미합니까? 나는 다형성을 보지 못했고 그것이 어떻게 관련성이 있는지를 보지 못했다. –

답변

2

은, 그것은 생성자로 전달하기위한 것. 어느 의미입니까? immutable으로 지정하는 것이 좋습니다. 예를 들어 :

여기
public class DFS { 
    final Graph g; 
    public DFS(Graph g) { 
    this.g = g; 
    } 

    public void doDfs(int source) { 
    // dfs computation 
    } 
} 

당신은 클래스 DFS 여러 방법 (자신의 알고리즘 각) 그래프 gDFS을 찾을 포함되어 있음을 알고있다. 이런 경우 g은 불변이며 모든 메소드 호출마다이를 전달하는 것이 어려울 것이므로 생성자 인수로 만드는 것이 좋습니다. 몇 가지 장점 :

  1. 모든 메소드 호출에는 중복 인수가 없습니다.
  2. 내부 캐싱을 수행하려는 경우 수행 할 수 있습니다. 이것은 모든 것이 알려진 개체와 관련이 있기 때문에 효과적입니다. g
  3. 스레드 안전, 명시 적 잠금 없음. 당신은 세터와 함께 필요할 것입니다.

즉, 무언가가 클래스의 정의로 변경되지 않는다는 것을 알게되면이를 생성자 인수로 지정하십시오. 이러한 인스턴스 변수를 사용하는 메소드가 있습니다. 뭔가가 변할 수 있음을 알 때 세터를 사용하십시오.

0

이것은 논리적 인 문제입니다. 클래스의 객체가 유효한 특정 데이터를 필요로하도록 클래스를 설계 한 경우 생성자에서 데이터를 제공해야합니다. assert을 사용하여 개체가 실제로 전달되었는지도 확인해야합니다.

하지만 은 나중에 데이터가 추가되도록 클래스를 디자인하려면을 선택하십시오. 그것은 당신이 당신의 수업을 어떻게 사용하는지에 달려 있습니다 - 당신은 그것의 사용자를위한 수업을 설계해야합니다.

현재 게시물에 "다형성은 값이 비쌉니다."라고 말하면됩니다. 아니, 다형성이 당신을 위해 일하는 것을 얻는다면 그것은 비싸지 않습니다. 그리고 그것은 당신이 의미하는 어떤 종류의 다형성에 달려 있습니다.

0

개인적으로 나는 옵션 4를 선호합니다. 생성자 나 최소 생성자가 없으므로 단위 테스트로 클래스를 테스트하는 것이 훨씬 쉬워졌습니다.

또한 큰 프로젝트에서는 매개 변수 만 보유하는 새 클래스를 만든 다음 이러한 클래스를 매개 변수로 사용하는 것을 선호합니다. 동일한 매개 변수가 많이 전달되면 나중에 모든 메서드를 변경하지 않고도 변경 작업을 훨씬 쉽게 수행 할 수 있습니다.

관련 문제