[java] 자바에서 허용되는 메소드 호출에서 ‘this’를 전달하고 있습니다.

메서드 호출에서 현재 개체를 전달하는 것이 좋은 / 나쁜 / 용인 할 수있는 방법입니까? 에서와 같이 :

public class Bar{
    public Bar(){}

    public void foo(Baz baz){
        //  modify some values of baz
    }
}

public class Baz{
    //constructor omitted

    public void method(){
        Bar bar = new Bar();
        bar.foo(this);
    }
}

구체적으로, 라인이 bar.foo(this)허용됩니까?



답변

사용하지 않을 이유가 없으며 this현재 인스턴스이며 사용하기에 완벽하게 합법적입니다. 사실 그것을 생략 할 수있는 깨끗한 방법은 종종 없습니다.

그래서 그것을 사용하십시오.

예없이 받아 들일 수 있다고 확신하기 어렵 기 때문에 (이러한 질문에 대한 부정적인 대답은 항상 논쟁하기 쉽습니다), 방금 가장 일반적인 java.lang클래스 중 하나 인 하나를 열었고 String물론이 사용 사례를 찾았습니다.

1084        // Argument is a String
1085        if (cs.equals(this))
1086            return true;

을 찾아 (this큰 “수용”프로젝트에, 당신은 그것을 찾기 위해 실패하지 않습니다.


답변

그게 잘못이 아닙니다. 무엇인가 좋은 연습을하지 않는 것은 당신이 아직 완전 초기화되지 않은 개체에 대한 참조를 줄 것이기 때문에, 같은 내부의 생성자를하는 것입니다.

여기에 비슷한 포스트가 있습니다. Java가 생성자
에서 이것을 유출 하고 후자가 왜 나쁜 습관인지에 대한 설명을 제공합니다.


답변

,하지만 두 가지에주의해야합니다.

  1. 전달 개체가 구성되지 않은 경우 아직 (즉 생성자에서)
  2. 살아 참조를 유지되고 방지하는 장수 객체에이 전달 쓰레기 수집되는 개체를.

답변

그것은 완벽하게 정상적이고 완벽하게 수용 가능합니다.


답변

이것은 현재 객체를 나타냅니다. 당신이하고있는 일은 체계적으로 정확하지만 동일한 클래스에서 메서드를 호출하는 경우 이것이 필요하지 않습니다.


답변

동일한 동작을 달성하기위한 덜 복잡한 대안이있는 경우 메서드 호출에서 현재 개체를 전달하는 것은 좋지 않습니다 .

정의에 따라 양방향 연결은 this한 개체에서 다른 개체로 전달되는 즉시 생성됩니다 .

Martin Fowler의 리팩토링을 인용하려면 :

양방향 연결을 단방향으로 변경 (200)

양방향 연결은 유용하지만 가격이 있습니다. 가격은 양방향 링크를 유지하고 개체가 올바르게 생성 및 제거되도록하는 데 따른 추가 복잡성입니다. 양방향 연결은 많은 프로그래머에게 자연스럽지 않으므로 종종 오류의 원인이됩니다.

필요한 경우 양방향 연결을 사용해야하지만 그렇지 않은 경우에는 사용하지 않아야합니다. 양방향 연관이 더 이상 무게를 당기지 않는 것을 보자 마자 불필요한 끝을 삭제하십시오.

따라서 이론적으로 우리는 통과해야 할 때 알람 벨을 듣고 당면한 this문제를 해결하기 위해 다른 방법을 정말 열심히 생각 해야합니다 . 물론 마지막 수단으로 그렇게하는 것이 합리적 일 때가 있습니다.

또한 전체적인 개선을 위해 장기적으로 코드를 리팩토링하는 동안 디자인을 일시적으로 손상시켜 ‘나쁜 연습’을해야하는 경우가 종종 있습니다. (한 걸음 뒤로, 두 걸음 앞으로).

실제로 나는 내 코드가 향상되었습니다 발견 대규모 전염병 등의 양방향 링크를 피함으로써.


답변

예. 당신은 그것을 사용할 수 있습니다 this. 프로그래밍에서 통과하는 것은 일반적입니다 . 그러나 그것을 사용하는 것에 대한 장단점이 있습니다.하지만 그렇게하는 것은 위험하지 않습니다.