2011-10-18 3 views
4

this의 사용에 대해 궁금합니다. 안드로이드의 샘플 코드와 문서가 this 키워드를 사용하지 않기 때문에 (저는 안드로이드 엔지니어가 일반적으로 똑똑하기 때문에 기본으로 사용합니다.). 나는 단지 안드로이드 엔지니어들이 this을 많이 사용하지 않는 근본적인 이유에 대해 궁금합니다.Java에서`this`를 사용하는 것은 나쁜 습관입니까?

+0

* this *없이 살 수없는 사례를 제공해 주시겠습니까? – Gleno

+0

'this'를 사용하는 것은 안드로이드에 대한 확신이없는 좋은 습관입니다. 핵심 가치 코딩과 관련이있을 수 있습니다. – Shahzeb

+0

나는 그것 없이는 살 수 있다고 생각하지만 개인적으로 이것을 사용하는 것이 더 쉽다. 나에게 더 명백하다. 따라서 명확하게 해준다. – cesar

답변

7

주로 스타일 차이가 있습니다. 나는 왜 그것이 좋은 것인지 나쁜지에 대한 논쟁을 아직 보지 못했다. 개인적으로 저는 그것을 사용하기를 좋아하고 그것을 사용해야 할 때가 있습니다.

예를 들어 부모 클래스의 메서드를 호출하려는 Anonymous Inner 클래스가있는 경우 this이 필요합니다. 예 :

class MyClass{ 
    protected void doSomething(){ 

    } 

    OnClickListener n = new OnClickListener(){ 
     public void onClick(View v){ 
      MyClass.this.doSomething(); 
     } 
    }; 

} 

this 다른 이유를 사용하는 방법은 인수 마스크 경우 멤버 변수이다. 이 경우 this을 사용하여이 둘을 구별 할 수 있습니다. 그러나 논 리의 이름을 마스킹이 아닌 것으로 변경하는 것이 좋습니다. 해당 인스턴스 내에서 현재의 클래스 인스턴스에 대한 포인터를 전달할 때 this를 사용하는

class MyClass{ 
    protected int val; 

    public void setVal(int val){ 
     this.val = val; // set the member variable equal to the method argument 
    } 

} 

또 다른 이유이다. 새 Intent

Intent i = new Intent(this, NewActivity.class); 

를 만들 때 이것의 예는 this를 사용해야합니다 아마 더 많은 장소가있다입니다. 이것들이 마음에 떠오르는 처음 몇 가지입니다.this를 사용

+0

이 옵션은 로컬 범위의 다른 것으로 숨겨진 현재 인스턴스의 일부에 액세스하려는 경우에만 필요합니다. OnClickListener에는 MyClass # doSomething()을 숨기는 doSomething()이 없기 때문에 내부 클래스에는 필요하지 않습니다. – jackrabbit

1

중요하지 않지만 코드에서 'this'를 사용하는 경우 모든 곳에서 사용하십시오. 그게 당신의 코드를 명확하게합니다.

0

나쁜 습관보다 개인적인 취향입니다.

0

아니요, 안드로이드 용 샘플 코드에는 'this'에 대한 참조가 있지만 나쁜 생각으로 생각할 이유는 없습니다. 그러나 시간이 많이 걸리는 것은 불필요하며 간결함을 위해 생략되었을 수도 있습니다.

예를 들어 정의 된 클래스 내에서 methodA()를 호출하면 this.methodA()라고 할 수 있습니다. 이 경우에는 전화를 걸 때 묵시적이므로 불필요합니다. 인수 이름이 설정중인 변수 이름과 동일한 setter에서 일반적으로 사용됩니다.

public void setName(String name) { 
    this.name = name; 
} 
1

당신은 어떻게 생각합니까? 예 : SDK coding style guide은 언급하지 않고 여러 곳에서 사용되는 것을 보았습니다. 그러나 변수에 대한 명명 지침을 따르면 종종 필요하지 않으며 생략 될 수 있습니다. 이는 종종 그렇습니다.

이 키워드를 사용하는 인스턴스를 언급 할 때 명료하게 사용할 수 있지만 문서에 언급 된대로 실제로 시행되는 스타일은 없으며 명명 규칙을 따르면 필요하지 않습니다.

와이없이 이름에 따라 완전히 유효한 세터는 첫 번째 예는 수 있지만, 그나마이를 사용한다는 것을

private int mCounter; 
    public void setCounter(int counter) { 
     mCounter = counter 
    } 

private int increment; 
public void setIncrement(int increment) { 
    this.increment = increment 
} 

참고 될 수있다. 두 번째로는 스타일 가이드와 더 가깝습니다.

+0

필자가 보았던 대부분의 샘플 코드와 문서는이 코드를 사용하지 않기 때문에 '이 코드'가 마음에 들지 않는다고 생각했습니다. 그것은 나를 위해 읽을 수있는 문서를 조금 더 어렵게 만들었습니다. 왜냐하면 메소드가 'startService()'라고 언급하고'startService()'가 포함 된 클래스를 알지 못하기 때문입니다. 메서드 호출에 대해서는 – cesar

+0

이 다릅니다. 한정자가 없으면 this.something()이 자동으로 Java에 일반적으로 거의 사용되지 않습니다. 나는 그것을 사용하지 않을 것이다. –

+0

* "나는 방금 ..."* - 합의는 당신이 잘못한 것임을 가정하는 것입니다. –

0

는 안전 조치의 더 :

class MyClass{ 
    void doSomething() { 
    } 

    OnClickListener n = new OnClickListener() { 
     void doSomething() { 
     } 

     public void onClick(View v){ 
      MyClass.this.doSomething(); // MyClass#doSomething() 
      this.doSomething(); // OnClickListener#doSomething() 

      doSomething(); // OnClickListener#doSomething() if present, 
          // MyClass#doSomething() otherwise - danger! 
     } 
    }; 
} 

는 회원의 존재 또는 방법을 제어 할 수없는 경우는 (예 OnClickListener 타사 클래스 인 경우)에 있기 때문에

예측 가능한 행동을 취하면 항상 그런 참조를 받아야합니다. 가변적 인 행동이 정확히 원하는 것이 아니라면.

관련 문제