2014-10-11 3 views
1

메서드 내에서 새로운 익명 클래스를 정의한 다음 아래 코드에 설명 된 것처럼 외부 클래스 전용 필드에 인스턴스를 할당하는 것이 합법적입니까? 나는 자바를 배우고 이것에 대한 이유를두고 머리를 쓰려고 노력하고있다. 감사!익명 클래스 및 초시계 전용 필드

public class Outer{ 
    private int id; 
    private String name; 
    private SwingWorker doSomething; //Is it ok not to include it in the constructor? 
public Outer (int id, String name){ 

    //constructor, but didn't include the instance doSomething 
} 
public void fuctionOne(){ 
    Swingworker doSomething =new SwingWorker<int, Void>(){ 
     protected int DoInBackground(){ 
      ...........// created an anonymous class and override methods 
+2

내가 해봤 니? 컴파일러는 뭐라고 말합니까? –

+0

"그리고 익명 클래스의 인스턴스를 외부 클래스의 private 필드에 할당하십시오."-> 예제에서이 작업을 수행하고 있음을 볼 수 없습니다. "functionOne()"에 새 로컬 변수를 사용 중입니다. –

답변

2
public void fuctionOne(){ 
    Swingworker doSomething = new SwingWorker<int, Void>(){ 
     protected int DoInBackground(){... 

당신은하지 Outer 클래스의 멤버에 할당 정의하고 여기에 로컬 변수를 초기화한다.

당신이 OuterdoSomething 멤버를 초기화하려면

는, 일반적으로
public void fuctionOne(){ 
    doSomething = new SwingWorker<int, Void>(){ 
     protected int DoInBackground(){... 

을, 당신은 생성자에 클래스의 모든 멤버를 초기화 할 필요가 없습니다. 초기화하지 않으면 기본값이 설정됩니다 (참조 유형의 경우 null). 실제로 사용하기 전에 초기화해야합니다.

+0

감사합니다! 미안 나는 차이를 얻지 않았다. Outer 클래스의 private 필드에 할당하는 경우는 어떻게됩니까? – stillAFanOfTheSimpsons

+0

@ user4056620 필자가 쓴대로, 그것은 완벽하게 괜찮습니다. – Eran

+0

아, 알 겠어! 고마워. – stillAFanOfTheSimpsons

1

예, 완벽하게 합법적입니다. 당신이이 액세스 규칙을 통해 생각하는 동안 몇 가지 염두에 두어야합니다 :에 란에서 언급 한 바와 같이

일이 서로
  1. , 당신은, 당신의 분야 인스턴스를 그림자있어 지역 변수 doSomething 있어요. 이것을 피할 필요가 있습니다. 그렇지 않으면 필드 인스턴스를 전혀 설정하지 않습니다.
  2. 내부 클래스는 메서드 및 필드의 private을 포함하여 외부 클래스에있는 모든 항목에 액세스 할 수 있습니다. 무엇이든 private은 정의 된 클래스 내에서만 액세스 할 수 있지만 요점은 내부 클래스 이 외부 클래스 내부에이라는 점입니다.
  3. 내부 클래스는 범위 밖에서 정의 된 로컬 변수에도 액세스 할 수 있지만 final으로 선언해야합니다.
+0

감사합니다. 그래서 내가하는 일은 doSomething을 지역 변수로 만드는 것입니다. 하지만이 클래스의 SwingWorker와 같은 내부 클래스의 경우 다른 클래스에서 Outer 인스턴스를 만들어야하므로 private 클래스 변수가 될 수 있습니까? – stillAFanOfTheSimpsons

+1

예, 물론입니다. 인스턴스 필드와 로컬 변수가 코드에 그대로 있습니다. 인스턴스 필드에 원하는 경우 지역 변수를 제거하십시오. –

1

일반적으로 컴파일하는 경우 허용됩니다. 네, 익명의 클래스 인스턴스를 private 필드에 할당하는 것은 허용됩니다.

그러나 코드에서는 필드에 아무 것도 지정하지 않습니다. 당신은 일반적으로 당신의 IDE가 당신에게 지역 변수의 차이를 표시하지만 당신은 항상

this.doSomething = ... ; 

를 사용할 수

public class Outer{ 
    private SwingWorker doSomething; 

    public void functionOne(){ 
    //SwingWorker doSomething = ...;//incorrect 
    doSomething = ...;//correct 
    } 
} 

을 다음과 같이이 더 명확하게하려면 코드를 수정해야 및 텍스트 색상을 조정하여 필드.

이제 문제는 좋은 일입니다. 당신이 클래스를 만들 때

  • 는 필드의 값은
  • null 당신은 모든 가능한 시간에 호출 할 수있는 필드에 값을 할당하는 공공 방법이있다. 메소드가 정확히 호출 될시기는 제어 할 수 없습니다.
  • 필드를 사용하는 다른 (공개) 메소드가있을 수 있습니다. 즉, 메서드는 null 값을 처리 할 수 ​​있어야하며 변수를 기본값으로 인스턴스화해야합니다.

따라서 클래스가 올바르게/예상대로 작동하려면 특정 순서로 호출되어야하는 public 메서드가있는 클래스가 생깁니다. 이것은 일반적으로 순서를 잊어 버리고 실수로 잘못된 순서로 메서드를 호출하기 때문에 가장 좋은 디자인 옵션이 아닙니다.

+0

설명이 잘되어 있습니다. 게다가 텍스트 색상 팁이 정말 유용합니다. – stillAFanOfTheSimpsons