Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Проблема области видимости


Автор: bulat01 21.10.2011, 16:17
здравствуйте все,

помогите разобраться,

вот фрагмент кода

Код

public class DataCollection2 extends javax.swing.JFrame {
        private JPanel jPanel1;
    private JButton button_cancel;
    private JButton button_next;
    private JButton button_back;
    private JSeparator jSeparator2;
    private JLabel note4;
    private JLabel note2;
    private JLabel note1;


        public String trueCount1;
        public String falseCount1;


public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                DataCollection2 datacoll2 = new DataCollection2();
                //dc2 = datacoll2;
                datacoll2.setLocationRelativeTo(null);
                datacoll2.setVisible(true);
                
            }
        });
    }




public void nextToDataProcessing() throws DfException, IOException {
        DataCollection2.this.setVisible(false);
        
        
        System.out.println("Class DC2: " + registryFileLoc2);
        System.out.println("Class DC2: " + validationFileLoc2);
        System.out.println("Class DC2: " + loadingFileLoc2);
        
        
        DataValidation dv = new DataValidation();
        dv.selectFromPickListItems(session_dc2);
        dv.readValidStatus();
        //dv.getDataCollection2(this);
        
        DataProcessing proc = new DataProcessing();
        proc.getDataCollection2(this);
        proc.getParameters2(check_for_new_doc, rb_new_doc, rb_next_minor_version, rb_next_major_version, check_for_update_attrs);
        proc.getParameters(registryFileLoc2, validationFileLoc2, loadingFileLoc2, clientx3, trueCount1, falseCount1 );
        
        System.out.println("true check from DC2: " + trueCount1);
        System.out.println("false check from DC2: " + falseCount1);

        proc.setLocationRelativeTo(null);
        proc.setVisible(true);
    }

        public void passVariablesValidStat(int trueCount, int falseCount) {
            this.trueCount1 = new Integer(trueCount).toString();
            this.falseCount1 = new Integer(falseCount).toString();
          
            System.out.println("true check from DC2 - passVariablesValidStat method: " + trueCount1);
            System.out.println("false check from DC2 - passVariablesValidStat method: " + falseCount1);
    
    }

}




внутри метода passVariablesValidStat - значения .trueCount1 и falseCount1 видны.
а внутри метода nextToDataProcessing - значения .trueCount1 и falseCount1 показывают null.

Не понимаю почему. Подскажите как решить эту проблему.

Автор: Pawl 21.10.2011, 16:30
может, они и в методе passVariablesValidStat не видны. Попробуй написать в этом методе
System.out.println(this.trueCount1);
System.out.println(this.falseCount1);

Автор: bulat01 21.10.2011, 16:45
нет - они в методе passVariablesValidStat видны.


Автор: LSD 21.10.2011, 16:59
Данных явно недостаточно. Что делает proc.getDataCollection2(this);? В какой момент вызываются оба этих метода?

Автор: bulat01 21.10.2011, 17:49
метод nextToDataProcessing (в классе DataCollection2 ) вызывается при нажатии кнопки Next.
этот метод передает определенные параметры (включая параметры из метода passVariablesValidStat ) следующей форме-классу DataProcessing .

метод nextToDataProcessing также запускает метод readValidStatus находящийся в классе DataValidation 
(этот метод вычисляет количество ячеек с TRUE или FALSE - чтение из csv файла а затем передает значения обратно через метод  passVariablesValidStat 
в класс DataCollection2)


Если я где то ошибся - пож-та укажите.
Просто недостаточно знаний и опыта в программировании java.







Автор: Pawl 21.10.2011, 19:37
Согласен с LSD.
Ты передаешь куда-то объект класса DataCollection2 методом proc.getDataCollection2(this); в этом где-то может что-то делаться с объектными переменными (в д. с. trueCount1 и falseCount1)... короче,  
Цитата(LSD @  21.10.2011,  16:59 Найти цитируемый пост)
Данных явно недостаточно.


Автор: math64 21.10.2011, 22:40
Скорее всего, не учитывется, что в Java параметры, в том числе String, передаются по значению.
Непонятно, зачем счётчики хранить в виде String - это не позволит изменить значения полей.
Чтобы можно было изменять значения счётчиков можно, например определить интерфейс:
Код

public interface IBooleanCounters {
setCounter(boolean b, int cnt);
int getCounter(boolean b);
}

public class DataCollection implements IBooleanCounters {
  private int trueCount;
  private int falseCount;
  public int getCounter(boolean b) { return b ? trueCount : falseCount; }
  public void setCounter(boolean b, int cnt) { if (b) trueCount = cnt; else falseCount = cnt; }
  public void process() {
     DataProcessing proc = new DataProcessing();
     proc.process(this);
  }   
}

public class DataProcessing {
  public void process(IBooleanCounters counters) {
     counters.setCounter(true, counters.getCounter(true) + 1);
     counters.setCounter(false, counters.getCounter(false) + 1);
  }
}

Автор: dobrolub 21.10.2011, 22:50
String – по ссылке. Но он final.

Автор: math64 21.10.2011, 23:31
Цитата(dobrolub @  21.10.2011,  22:50 Найти цитируемый пост)
String – по ссылке. Но он final.

Нет, всё - по значению. Но для классов передаётся по значению указатель. Через него можно изменить объект, на который он указаывает,
но не сам указатель - после присвоению параметру нового значения он становится обычной локальной переменной.
Кроме String нельзя изменить также объекты типа Boolean, Integer, Double и т.д.


Автор: dobrolub 22.10.2011, 00:02
Object references are passed by value.

Автор: ИванИванович 25.10.2011, 06:18
Цитата

Кроме String нельзя изменить также объекты типа Boolean, Integer, Double и т.д.

Нельзя - это пожалуй слишком сильное слово т.к. если очень хочется изменить, то можно. Но переопределить нельзя. A значит, если proc.getParameters это функция которая пытается инициализиривать  trueCount1 и falseCount1, то у нее ничего не получится smile

Цитата

Object references are passed by value.


Забавно, то что Java  называет references , на самом деле pointers smile
В http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.3.1  они так и пишут:
The reference values (often just references) are pointers to these objects.
Т.е.
Цитата

для классов передаётся по значению указатель

абсолютно верно 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)