Как получить доступ к полю класса в сложной цепочке классов - PullRequest
0 голосов
/ 25 октября 2011

Мой класс 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Упражнение {

    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 ]

3 голосов
/ 25 октября 2011

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

0 голосов
/ 25 октября 2011

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

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

0 голосов
/ 25 октября 2011

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

...