문제

이 질문은 이미 여기에 답이 있습니다.

사용하기위한 모범 사례는 무엇입니까? this Java의 키워드? 예를 들어 다음 수업이 있습니다.

class Foo {
    Bar bar;

    public Foo(Bar bar) {
         this.bar = bar;
    }
}

그것은 괜찮습니다. 그러나 Java는 생성자의 진술을 변경하면 무슨 일이 일어나고 있는지 알기에 충분히 영리합니다.

 bar = bar;

그래서 왜 사용하십시오 this 예어? (나는 어떤 상황에서는 그것을 완전히 사용해야한다는 것을 알고 있습니다. 나는 단지 이와 같은 상황을 요구합니다). 실제로, 나는 가독성을 위해 순전히 키워드를 사용하는 경향이 있지만 일반적인 관행은 무엇입니까? 상점 전체에 그것을 사용하면 내 코드가 약간 지저분 해 보입니다.

boolean baz;
int someIndex = 5;
this.baz = this.bar.getSomeNumber() == this.someBarArray[this.someIndex].getSomeNumber();

분명히 약간의 코드가 좋지 않지만 내 예를 보여줍니다. 이 경우 개인 선호도에 달려 있습니까?

도움이 되었습니까?

해결책

그러나 Java는 생성자의 진술을 변경하면 무슨 일이 일어나고 있는지 알기에 충분히 영리합니다.

  bar = bar;

거짓! 그것은 컴파일하지만 당신이 생각하는 것을 수행하지 않습니다!

그것을 사용하는시기에 관해서는, 많은 것이 개인적인 취향입니다. 나는 사용하는 것을 좋아한다 this 내 공개 방법에서는 불필요한 경우에도 인터페이스가 발생하는 곳이기 때문에 내 것과 그렇지 않은 것을 주장하는 것이 좋습니다.

참고로, 당신은 이것에 대한 Oracle의 Java 튜토리얼을 확인할 수 있습니다 .Subject ;-)

http://docs.oracle.com/javase/tutorial/java/javaoo/thiskey.html

다른 팁

필드와 동일한 이름의 매개 변수가 있으면 문제가 발생합니다. 컴파일하지만 반드시 원하는 것을 수행 할 필요는 없습니다.

다른 곳에서는 가독성을 위해 필요하지 않으면 사용하지 마십시오. 어디에서나 사용하면 코드의 20%가 'this'라는 단어로 구성됩니다!

실제로

baz = baz

이 경고를 제기 할 것입니다

가변 BAZ에 대한 할당은 효과가 없습니다

그래서 당신이 잘못 생각하는 것은 로컬 범위가 클래스 속성을 무시합니다. 해야 하다 사용 this 키워드가 클래스 속성에 변수를 할당하는 것입니다.

그렇지 않으면 할당에 설명 된 변수는 매개 변수로 전달 된 변수이며 클래스는 무시됩니다. 그것이 이유입니다 this 유용합니다. 가독성의 사실이 아니며, 명시 적으로 결정하는 사실입니다. baz 말을하는거야.

내가 말할 것

사용 this 그것을 사용하지 않으면 모호성 (또는 더 중요한 컴파일러 경고)을 유발할 수 있습니다. 그렇지 않으면 남겨 두십시오. 기본적 가정 (첫 번째로 현지인을 확인한 다음 클래스 속성을 확인)이 충분하지 않을 때는 모호성을 해결하는 것이 목적입니다.

this 키워드는 일부 메소드가 호출되는 클래스의 객체를 나타냅니다.
예를 들어:

public class Xyz {  
    public Xyz(Abc ob)
    {
        ob.show();
    }
}

public class Abc {
    int a = 10;

    public Abc()
    {
        new Xyz(this);
    }

    public void show()
    {
        System.out.println("Value of a " + a);
    }

    public static void main(String s[])
    {
        new Abc();
    }
}

여기 Abc() 우리는 전화하고 있습니다 Xyz() ABC 클래스의 개체가 필요한 .. 그래서 우리는 통과 할 수 있습니다. this 새로운 대신 Abc(), 우리가 새로 통과하면 Abc() 여기서 그것은 계속해서 스스로를 부를 것입니다.

또한이를 사용하여 클래스 변수와 메소드 변수 변수를 구별합니다. 예를 들어

class Abc {
    int a;

    void setValue(int a)
    {
        this.a = a;
    }
}

여기 this.a IS는 클래스 ABC의 변수 A를 나타냅니다. 따라서 새로 사용하는 것과 동일한 효과가 있습니다 Abc().a;.

그래서 당신은 말할 수 있습니다 this 현재 클래스의 대상을 나타냅니다.

사용하는 것이 일반적입니다 이것 키워드 명시 적 생성자 호출. 당신은 예제를 볼 수 있습니다 선적 서류 비치.

public class Rectangle {
    private int x, y;
    private int width, height;

    public Rectangle() {
        this(0, 0, 1, 1);
    }
    public Rectangle(int width, int height) {
        this(0, 0, width, height);
    }
    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
    ...
}
public Foo(Bar bar) {
     this.bar = bar;
}

동일하지 않습니다

public Foo(Bar bar) {
     bar = bar;
}

두 번째 경우 범위의 막대는 매개 변수이므로 자체로 할당합니다. this.bar 유적 null.

그것은 개인적인 취향입니다 - 스타일을 선택하고 그것을 고수하십시오. 나는 개인적으로 사용합니다 this 그러나 다른 사람들은 그것이 중복이라고 생각합니다.

컨벤션에 따라 가독성을 위해 사용할 수 있습니다. 그것은 객체 변수라는 사실을 강조합니다.

또한 변수와 같은 이름의 세터 인수를 원합니다 (메소드 서명에서 더 좋아 보입니다). 당신은 필요합니다 this 이 경우.

나는 항상 사용하려고 노력합니다 this 로컬 클래스 객체의 키워드.

객체가 정적 객체 또는 클래스 객체인지 시각적으로 상기시키는 데 사용합니다.

그것은 나와 컴파일러가 메소드 인수와 로컬 클래스 객체를 구별하는 데 도움이됩니다.

public void setValue(int value){
  this.value = value;
}

내부/중첩/익명 클래스에 로컬 객체가 있는지 시각적으로 상기 시켜서 클래스 객체를 캡슐화하는 것과 차별화하는 데 도움이됩니다. 없다면 this 접두사, 내 컨벤션은 그것이 캡슐화 클래스의 대상임을 상기시켜 줄 것입니다.

public class Hello{
  public int value = 0;
  public boolean modal = false;

  public class Hellee{
    public int value = 1;
    public getValue(){
      if (modal)
        return 0;
      return this.value;
    }
  }
}
void set(int real)
{
    this.real = real;
}

여기 this 인스턴스 변수가 로컬 변수와 동일 할 때 사용되는 키워드입니다.
또 다른 사용 this 생성자 과부하입니다. 과부하 된 생성자에서 생성자를 호출 할 수 있습니다.

개인적 선호도이지만 모호성 만 해결하기 위해 사용하며, 매우 드문 경우에 할당 된 변수가 필드라는 것을 분명히 생각합니다. 모든 단일 필드 참조에서 사람들이 "this.field"를 사용하는 프로젝트가 있습니다. 나는이 연습이 불쾌한 시점까지 시각적으로 산만 해지지 만, 그러한 코드를 한 번에 한 번 볼 준비가되어 있어야한다.

나는 비밀리에 275 '이'키워드를 가진 500 개의 라인 클래스를 작성하는 사람들에게 특별한 장소가 있다고 생각하지만,이 스타일은 일부 오픈 소스 프로젝트에서 발견되므로 각자 자신의 것 같습니다.

복제 물체에 사용하십시오 (카피 생성자를 통해 자체를 참조하여).

상속하는 물체에 유용합니다 Cloneable.

public Foo implements Cloneable {
  private String bar;

  public Foo(Foo who) {
    bar = who.bar;
  }

  public Object getClone() {
    return new Foo(this);  //Return new copy of self.
  }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top