2011-10-25 2 views
0

내 클래스 A는 생성자에 클래스 B의 인스턴스를 만듭니다. 클래스 B의 생성자는 내부 클래스 C의 인스턴스를 만듭니다. 클래스 C는 생성자에서 클래스의 필드를 필요로합니다. 여기에 문제가 있습니다. 클래스 C는 A 필드의 기본값에만 도달합니다.복잡한 클래스 체인의 클래스 필드에 액세스하는 방법

B 및 C의 시작을 시작하기 전에 A의 생성자에서 A 필드의 값을 초기화합니다. 필드에 필요한 값이 있는지 확인했습니다. 그럼에도 불구하고 C의 생성자에서 해당 필드의 값은 항상 기본 필드입니다. 어떻게 처리해야할지 모르겠습니다. 어떤 도움이 필요합니까?

감사합니다.

모든 답변을 주셔서 감사합니다. 더 많은 정보가 필요하다고 느꼈습니다.

이것은 내 수업 A의 일부입니다. 문제가되는 변수는 startX와 startY입니다. 나는 그들을 생성자에서 직접 정의하거나 setter 메서드를 통해 정의했다. 클래스 B는 DrawView입니다. 클래스 C는 DrawThread입니다. DrawView의 생성자에 인수를 전달하는 방법을 모르겠습니다. 그렇지 않으면 제가 생각합니다. 도움? 또 다른 옵션은/* display = ((WindowManager) getSystemService (Context.WINDOW_SERVICE)). getDefaultDisplay();를 사용하는 것입니다.

DrawView 또는 DrawThread에서 startX 및 startY를 설정하지만 작동하지 않으려 고합니다. 이것은 정말 내 안드로이드에 대한 질문을 전환하고, 모든 제안의 궁극적 인 목표였던 DrawThread의 생성자에서 화면 크기를 얻는 방법에 대해 감사드립니다. :)

공용 클래스 ColorAnimation는 {

public static float startX; 

    public static float startY; 

      //other stuff here 

      @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // turn off the window's title bar 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     // tell system to use the layout defined in our XML file 
     setContentView(R.layout.main); 
     /*display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 

     startX = display.getWidth(); 
     startY = display.getHeight();*/ 

     mDrawView = (DrawView) findViewById(R.id.pend); 
     mDrawThread = mDrawView.getThread(); 

     // give the DrawView a handle to the TextView used for messages 
     mDrawView.setTextView((TextView) findViewById(R.id.text)); 

생성자 클래스 B의 활성 연장 :

//

공개 DrawView (컨텍스트 컨텍스트 속성 세트에 바인드합니다) { 슈퍼 (문맥, 바인드합니다)를; 클래스 C DrawThread의

// register our interest in hearing about changes to our surface 
    SurfaceHolder holder = getHolder(); 

    holder.addCallback(this); 

    thread = new DrawThread(holder, context, new Handler() { 

     @Override 
     public void handleMessage(Message m) { 
      mStatusText.setVisibility(m.getData().getInt("viz")); 
      mStatusText.setText(m.getData().getString("text")); 
     } 
    }); 

    setFocusable(true); // make sure we get key events 
} 

는 // 부분 :

클래스 DrawView은 서피스 뷰 SurfaceView가의 SurfaceHolder.Callback {

class DrawThread extends Thread {//................ 
     //.............. 


    public DrawThread(SurfaceHolder surfaceHolder, Context context, 
      Handler handler) { 
     // get handles to some important objects 
     mSurfaceHolder = surfaceHolder; 
     mHandler = handler; 
     mContext = context; 
를 구현 확장 당신은 필드 A의 값에 액세스 클래스 A의 함수를 만들 수
+0

음 ... 코드를 제공해 주시겠습니까? 어쩌면 A-B-C 이름 추상화의 유무에 관계없이 요청하는 것과 관련된 클래스의 부분 만 가져갈 수 있습니다. 그것은 소리가 일종의 제대로 작동해야하기 때문에. –

+0

네, 코드는 위이지만 자바보다 더 안드로이드가되었습니다 – Kamelia

답변

0

클래스 A의 인스턴스를 클래스 C로 전달합니다. 자세한 내용이 없으면 좀 더 자세한 대답을 줄 수 있다고 생각하지 않습니다.

3

클래스 A의 생성자가 완료 될 때까지 (즉 B와 C의 생성자가 완료되었음을 나타냄) 완전히 빌드 된 채워진 A 인스턴스에 대한 액세스 권한이 없다고 가정하는 것이 가장 좋습니다. A.field로 설정 한 값을 B 클래스의 생성자로 내리고 그런 식으로 참조하십시오.

0

실제로는 클래스 인 경우 필드이면 작동합니다. 이 SSCCE는 항상 "A SET IT"를 반환합니다.

class A { 

    public static String VALUE = "default"; 

    public A() { 
     VALUE = "A SET IT"; 
     B b = new B(); 
    } 

} 

class B { 

    public B() { 
     C c = new C(); 
    } 

    public static class C { 
     public C() { 
      String value = A.VALUE; 
      System.out.print(value); 
     } 
    } 
} 


public class Runner { 
    public static void main(String[] args) { 
     A a = new A(); 
    } 
} 

액세스하려는 값이 정말 객체 필드 인 경우

(즉,아니요 static), 그렇지 않습니다. 생성자가 완료 될 때까지 객체가 실제로 생성되지 않습니다.

사용자가 언급하지 않은 클래스 로더, 스레드 등 특정 경우에 영향을 줄 수있는 다른 사항이있을 수 있습니다.

+1

어디서 잘못되었는지 (그리고 이것은 잡았다 ...) 그의 클래스 C는 익명의 내부 클래스 였으므로 언제든지 호출 될 수 있습니다. 그러나 그는 건설 당시 A 필드를 사용하여 B를 정의하지 않았습니다. 사양에서는 C가 끝날 때까지 A를 사용하지 않는다고 말합니다 ... C는 초기화되지 않은 A로 초기화되었습니다 (OP 게시물에 따라). 그래서 A.field는 기술적으로 정의되지 않았습니다. – Pedantic

+0

즉,'this'를'this'의 생성자 안에있을 때 인스턴스화하는 클래스에'this'를 전달할 수없고, 정말로주의하지 않는 한 일관된 결과를 기대할 수 없습니다. – Pedantic

+0

@Chris 잘 발견되었습니다! 나는이 행동을 기대하지 않았을 것이다. 기억해야 할 것이 있습니다. –