статическая переменная теряет свое значение - PullRequest
0 голосов
/ 15 января 2011

У меня есть вспомогательный класс с этой статической переменной, которая используется для передачи данных между двумя классами.

public class Helper{
    public static  String paramDriveMod;//this is the static variable in first calss
}

эта переменная используется в следующем методе второго класса

    public void USB_HandleMessage(char []USB_RXBuffer){
    int type=USB_RXBuffer[2];
    MESSAGES ms=MESSAGES.values()[type];
    switch(ms){
        case READ_PARAMETER_VALUE:  // read parameter values
            switch(prm){
                case PARAMETER_DRIVE_MODE:  // paramet drive mode
                    Helper.paramDriveMod =(Integer.toString(((USB_RXBuffer[4]<< 8)&0xff00)));
                    System.out.println(Helper.paramDriveMod+"drive mode is selectd ");
                    //here it shows the value that I need...........
            }
    }
    //let say end switch and method
}

иНиже приведен метод третьего класса, использующий приведенный выше метод класса

public void buttonSwitch(int value) throws InterruptedException{
    boolean bool=true;
    int c=0;
    int delay=(int) Math.random();
    while(bool){
        int param=3;
        PARAMETERS prm=PARAMETERS.values()[param];
        switch(value){
            case 0: 
                value=1;
                while(c<5){
                    Thread.sleep(delay);                
                    protocol.onSending(3,prm.PARAMETER_DRIVE_MODE.ordinal(),dataToRead,dataToRead.length);//read drive mode
                    System.out.println(Helper.paramDriveMod+"  drive mode is ..........in wile loop");//here it shows null value
                }
                //break; ?
        }
    }
    //let say end switch and method
}

. По какой причине эта переменная теряет свое значение?

Ответы [ 6 ]

1 голос
/ 06 марта 2013

Насколько я понимаю, «класс» (не просто экземпляр, а весь объект класса) может быть собран мусором, как и любой другой объект, на который нет ссылок - статическая переменная в этом экземпляре класса не помешает GC собирать ваш класс.

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

Собираюсь продолжить исследование сейчас.

Только что нашел этот вопрос, проверьте принятый ответ - похоже, маловероятно, что из-за ГХ будет потеряна статика, но возможно.

Открыты ли статические поля для сборки мусора?

1 голос
/ 15 января 2011

Могу ли я предложить, чтобы для передачи данных между классами вы использовали отдельные объекты вместо глобальной переменной?

Не совсем ясно, как вы ожидаете, что код в protocolImpl будет выполнен - ​​как упоминается в templatetypedef, вы не показали допустимый код Java ни в том, ни в классе param (ни один из которых не следует соглашениям об именах Java) ).

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

0 голосов
/ 31 июля 2012

Поток выполнения не показан - может быть 3-й код:

while(c<5){
    Thread.sleep(delay);                
    protocol.onSending(3,prm.PARAMETER_DRIVE_MODE.ordinal(),dataToRead,dataToRead.length);//read drive mode
    System.out.println(Helper.paramDriveMod+"  drive mode is ..........in wile loop");//here it shows null value  "

выполняется перед вторым кодом

switch(ms)
{
    case READ_PARAMETER_VALUE:  // read parameter values
        switch(prm){
            case PARAMETER_DRIVE_MODE:  // paramet drive mode
                Helper.paramDriveMod =(Integer.toString(((USB_RXBuffer[4]<< 8)&0xff00)));
0 голосов
/ 15 января 2011

Может быть, вы путаете static с final?Значения статических переменных могут меняться.Окончательные значения переменных не могут.

0 голосов
/ 15 января 2011

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

0 голосов
/ 15 января 2011

Переменная никогда не «теряет» свое значение. Вы где-то устанавливаете его в «null», но вашего кода здесь недостаточно, чтобы рассказать, что происходит. Единственное место, где вы устанавливаете это, это строка:

Helper.paramDriveMod =(Integer.toString(((USB_RXBuffer[4]<< 8)&0xff00)));

Но если вы передадите "null" toString (), вы получите исключение нулевого указателя ... поэтому я предполагаю, что эта строка никогда не попадет, и поэтому вы получите значение "null", так как вы не инициализируете paramDriveMod с другим значение.

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