Как получить доступ к полю класса в сложной цепочке классов

Мой класс A создает в своем конструкторе экземпляр класса B. Конструктор класса B создает экземпляр своего внутреннего класса C. Класс C нуждается в поле в своем конструкторе из класса A, и здесь возникает проблема. Класс C достигает только значения по умолчанию поля A.

Я инициализирую значение поля A в конструкторе A перед началом инициализации B и C. Я проверил, что поле имеет нужное мне значение. Тем не менее, значение этого поля в конструкторе C всегда является значением по умолчанию. Я не уверен, как с этим бороться. Любая помощь?

Спасибо!

Спасибо ребята за все ответы! Я чувствовал, что нужно больше информации.

Это часть моего класса А. Проблемными переменными являются startX и startY. Я определил их в конструкторе либо напрямую, либо через метод setter. Класс 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 (Контекстный контекст, атрибуты AttributeSet) {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 ответа

Пока конструктор для класса A не будет завершен (что означает, что конструкторы для B и C завершены), лучше всего предполагать, что у вас нет доступа к полностью сконструированному и заполненному экземпляру A. Вы должны передать значение, которое вы Вы устанавливаете A.field в конструктор класса B и ссылаетесь на него таким образом.

Если это действительно поле класса, то оно должно работать. Этот 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), это не так - объект на самом деле не создается до завершения конструктора.

В вашем конкретном случае это может повлиять на другие вещи - загрузчики классов, потоки и т. Д., Которые вы не упомянули.

Вы можете создать функцию в классе A, которая получает доступ к значению поля A. Затем просто передать экземпляр класса A до класса C. Без подробностей я не думаю, что смогу дать более подробный ответ.

Другие вопросы по тегам