Как получить доступ к полю класса в сложной цепочке классов
Мой класс 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. Без подробностей я не думаю, что смогу дать более подробный ответ.