Мне нужно использовать нестатическую переменную внутри статического класса ... Как обойти это? - PullRequest
0 голосов
/ 04 августа 2011

Вот тип схемы соответствующей проблемы:

public class Foo extends Activity{

    Cursor myCursor;

    public void onCreate(Bundle savedInstanceState) {
        //I initialize myCursor here
    }

    public void setCursor(){
        //When we are interested in a different set of data, the cursor changes here
    }

    public static class MySurfaceView extends SurfaceView implements Runnable{
        public void run(){
            //I need to access myCursor here
        }
    }
}

Я знаю, что не могу получить доступ к нестатической переменной из статического класса, но я не могу сделать myCursor статическим, потому что это потребует замены почти всех моих функций на статические. Любые советы?

Ответы [ 3 ]

3 голосов
/ 04 августа 2011

Почему внутренний класс статичен? Если вы удалите статический модификатор, он получит доступ к своему классу включения и впоследствии к myCursor.

Если он должен быть статическим, тогда вы можете просто передать необходимый Foo объект в его конструктор и использовать его как ссылку на включающий класс. Не так аккуратно, но все равно должно работать.

Независимо от того, static (в поле) означает, что он принадлежит классу, а не объекту. Возможно, вы путаетесь с final, что означает, что ссылка не может быть изменена?

На внутреннем классе он ведет себя по-разному (и не обязательно логически!). Он удаляет ссылку из внутреннего класса на внешний класс, так что это по сути совершенно отдельный класс, просто находящийся внутри другого.

Если вы хотите получить более подробный ответ, вам нужно будет предоставить более подробную информацию о контексте вашего приложения - трудно сказать, что должно и не должно быть статичным только из этого фрагмента кода.

1 голос
/ 04 августа 2011

Пара вариантов

  1. Передача Foo (или непосредственно myCursor) объекта в MySurfaceView конструктор.
  2. Создание MySurfaceView нестатического
0 голосов
/ 04 августа 2011

Статические вложенные классы не имеют доступа к другим членам включающего класса, как указано в java tutorials , что заставляет меня задуматься, зачем вам нужен класс MySurfaceView для статичности?Вы можете просто сделать это вложенным классом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...