如何访问复杂的类链中的类字段

时间:2011-10-25 16:12:53

标签: java android constructor-chaining

我的类A在其构造函数中创建一个类B的实例。类B的构造函数创建其内部类C的实例。类C在其构造函数中需要一个字段来自类A,这就是问题所在。 C类仅达到A字段的默认值。

在开始启动B和C之前,我在A的构造函数中初始化A的字段的值。我检查了该字段是否具有我需要的值。然而,C中构造函数中该字段的值始终是默认值。 我不知道如何处理这个问题。有什么帮助吗?

谢谢!

谢谢大家的所有答案!我觉得有必要提供更多信息。

这是我的A类的一部分:有问题的变量是startX和startY。我在构造函数中直接定义了它们,通过setter方法定义了ether。 B类是DrawView。 C类是DrawThread。 我不知道如何将参数传递给DrawView的构造函数,否则我会。救命? 另一种选择是使用/ * display =((WindowManager)getSystemService(Context.WINDOW_SERVICE))。getDefaultDisplay();

在DrawView或DrawThread中

设置我的startX和startY,但它只是不想工作。 这真的将我的问题更多地转换为android现在,我将非常感谢任何建议如何在DrawThread的构造函数中获取屏幕大小,这是所有这一切的最终目标:)?

公共类ColorAnimation扩展了Activity {

    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类构造函数:

//

public DrawView(Context context,AttributeSet attrs){         super(context,attrs);

    // 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
}

// C类DrawThread的一部分:

类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; 

3 个答案:

答案 0 :(得分:3)

在A类的构造函数完成之前(这意味着B和C的构造函数已经完成),最好假设您无权访问A的完全构造和填充的实例。您应该向下传递你将A.field设置为B类的构造函数并以这种方式引用它。

答案 1 :(得分:0)

你可以在A类中创建一个访问字段A值的函数。然后只需将类A的实例一直传递给C类。没有更多细节,我认为我不能给出更详细的信息。答案。

答案 2 :(得分: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),则情况并非如此 - 直到该对象才真正创建构造函数完成。

在您的具体案例中可能还有其他影响这一点的事情 - 您没有提及的类加载器,线程等。