Как мне приблизить наличие статической переменной во внутреннем классе? - PullRequest
0 голосов
/ 09 октября 2011

Я работаю над серией классов, которые все наследуют от одного базового абстрактного класса.

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

Мне бы хотелось реализовать следующее в моем абстрактном классе:

abstract class ParentObject{

   static int GUID = 0;

   //other stuff

}

после этого каждый дочерний класс в своем конструкторе будет иметь myGUID = GUID++;

Однако всякий раз, когда я пытаюсь это сделать, в IDE обработки появляется следующая ошибка:

Поле GUID не может быть объявлено статическим; статические поля могут быть только объявлено в статических типах или типах верхнего уровня.

Из-за того, как Processing обрабатывает файлы классов (все является внутренним классом), у меня не может быть статических членов класса. Какие есть варианты дублирования этой функции другими способами?

Редактировать: Это делается в обработке и IDE обработки. Класс ParentObject равен в своем собственном файле обработки.

Edite2: Я узнал, что причина обработки отличается от Java в том, что все классы обработки являются внутренними классами. По этой причине я повторно добавил тег Java и переформулировал вопрос.

Ответы [ 2 ]

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

Ну, тогда посмотри правде в глаза. Вы не можете сделать это. Если вам ДЕЙСТВИТЕЛЬНО это нужно, объявите внешний класс для обработки этого фрагмента кода и вызовите его в конструкторе класса верхнего уровня.

Если вы ДОЛЖНЫ использовать эту иерархию внутреннего класса, то вы не сможете этого сделать. Java не примет это так, как вы этого не хотите. Вы можете объявить свой абстрактный класс как статический.

static abstract class ParentObject {

    private static int GUID = 0;

}

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

public class GUID {

    private static int GUID = 0;

    public synchronized static void increment() {
        GUID++;
    }
}

abstract class ParentObject {

    ParentObject() {

        GUID.increment();

        // constructor's stuff
    }

}

Это может ускорить ваше приложение (в зависимости от того, как часто вы создаете экземпляр класса), но незначительным образом.

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

статический защищенный метод getNextGUID () будет работать

public abstract class ParentObject{

   private static int GUID = 0;

   protected static int getNextGUID(){
       return GUID++;
   }
   //other stuff

}

не забудьте синхронизировать его / использовать AtomicInteger, когда у вас несколько потоков

...