programing

Java에서 수락된 메서드 호출 프랙티스로 'this'를 전달하고 있습니다.

randomtip 2022. 9. 8. 21:31
반응형

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)받아들일 수 있습니까?

그건 문제될 게 없어요.아직 완전히 초기화되지 않은 개체를 참조할 수 있으므로 동일한 내부 생성자를 사용하는 것이 좋습니다.

여기에는 유사한 게시물이 있습니다. Java는 이를 컨스트럭터로 유출하여 왜 후자가 나쁜 관행인지 설명합니다.

사용하지 않을 이유가 없습니다.this현재의 사례이며, 사용하기에 완벽하게 합법적입니다.사실 그것을 생략할 수 있는 깔끔한 방법이 종종 없다.

그러니까 쓰세요.

사례 없이 받아들일 수 있다는 것을 납득시키는 것은 어렵기 때문에 (그런 질문에 대한 부정적인 대답은 항상 논쟁하기 쉽다) 가장 흔한 것 중 하나를 열었다.java.lang클래스,String하나는 물론 이 용도의 예를 들 수 있습니다.

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

찾다(this큰 「중요한」프로젝트에서는, 반드시 찾을 수 있습니다.

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

  1. 개체가 아직 생성되지 않은 경우(즉, 생성자에서) 전달
  2. 이 정보를 장수하는 개체에 전달하면 참조가 활성 상태로 유지되고 이 개체가 가비지 수집되지 않습니다.

그건 지극히 정상적이고 완벽하게 받아들일 수 있는 일이야.

이것은 현재 객체를 나타냅니다.당신이 하고 있는 것은 문법적으로는 맞지만, 만약 당신이 같은 수업에서 메서드를 호출한다면 나는 이것이 필요하지 않다고 생각합니다.

동일한 동작을 실현하기 위한 복잡한 대체 방법이 없을 경우 메서드 호출에서 현재 개체를 전달하는 것은 잘못된 관행입니다.

정의상, 쌍방향 어소시에이션은, 다음의 순서로 작성됩니다.this하나의 객체에서 다른 객체로 전달됩니다.

Martin Fowler의 Refactoring을 인용하자면:

양방향 어소시에이션을 단방향(200)으로 변경

쌍방향 연관성은 유용하지만 대가가 따른다.가격은 양방향 링크를 유지 보수하고 오브젝트가 적절하게 생성 및 제거되도록 하는 복잡성이 가중됩니다.많은 프로그래머에게 쌍방향 어소시에이션은 자연스러운 것이 아니기 때문에 대부분의 경우 에러의 원인이 됩니다.

...

필요할 때는 쌍방향 어소시에이션을 사용해야 하지만 사용하지 않을 때는 사용하지 마십시오.쌍방향 어소시에이션이 그 무게를 끌어내지 않게 된 것을 확인하면, 불필요한 엔드를 드롭 합니다.

이론상으로는 '경보벨'을 ''을 수 .this그리고 당면한 문제를 해결할 수 있는 다른 방법을 생각하려고 정말 열심히 노력하세요.물론 최후의 수단으로 그것을 하는 것이 말이 될 때도 있다.

또, 전체적인 개선을 위해서, 코드의 장기적인 리팩터링중에, 설계를 일시적으로 손상시켜 「부적절한 프랙티스」를 실시할 필요가 있는 경우도 있습니다.(한 걸음 뒤로, 두 걸음 앞으로).

실제로 나는 전염병과 같은 양방향 연결을 피함으로써 내 코드가 크게 개선되었다는 것을 알았다.

네, 쓰셔도 됩니다.합격하는 것은 프로그래밍에서 흔히 있는 일이다.this하지만 그것을 사용하는 것에 대해서는 찬반 양론이 있다.을 사용하다

더서 passing 한 just just 、 passing just 。this가 올바르고 적절한 설계를 따르고 있습니다.방문자 패턴방문자 설계 패턴, 방법accept(Visitor v)는 보통 '일부러'라고 됩니다.v.visit(this).

수용 가능

Oracle JAVA 문서의 일부:

인스턴스 메서드 또는 생성자 내에서 현재 개체(메서드 또는 생성자가 호출되는 개체)에 대한 참조입니다.이를 사용하여 인스턴스 메서드 또는 생성자 내에서 현재 개체의 모든 멤버를 참조할 수 있습니다.

필드에서의 사용

이 키워드를 사용하는 가장 일반적인 이유는 필드가 메서드 또는 컨스트럭터 파라미터에 의해 음영 처리되기 때문입니다.

자바어그러나 오브젝트는 메서드에 전달되지 않습니다.
java는 오브젝트를 메서드에 전달할 때 먼저 오브젝트 자체의 복사본이 아닌 오브젝트에 대한 참조 복사본을 만듭니다.따라서 자바에서는 이 방법이 널리 사용되고 있습니다.그리고 가장 흔하게 따라하는 관례입니다.

언급URL : https://stackoverflow.com/questions/17441871/is-passing-this-in-a-method-call-accepted-practice-in-java

반응형