Используя значение int, которое находится в другом файле класса?

#java #class #integer #int

#java #класс #целое #int

Вопрос:

Я хочу использовать значение int, которое находится в Gui.class, в DrawPanel1.class как я могу легко передавать значение int из класса в файл класса? Мое значение int:


/* Gui.java */
static int gamestate = 1;

Я хочу уменьшить gamestate на 1, в DrawPanel.java в buttonHandler, например, так:

 /*DrawPanel.java */ 
    class StartNewGameHandler implements ActionListener{
     public void actionPerformed( ActionEvent e ){
                    gamestate--;
     }
}
  

Ответ №1:

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

 Gui.gamestate--;
  

Однако я бы настоятельно рекомендовал вам сохранять переменные закрытыми (кроме констант) и получать к ним доступ через свойства. Изменяемые статические переменные тоже часто являются плохой идеей.

Комментарии:

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

2. В дополнение к моему ответу я также разделяю ту же рекомендацию.

3. @Stan вы могли бы создать новый объект типа Gui и получить доступ к свойству

4. @Stan: Лучший ответ не всегда тот, который просто быстрее всего отключает компилятор. Вам следует подумать о том, почему компилятор жалуется, и рассмотреть наилучший способ решения этой проблемы … который я предлагаю в данном случае, вероятно, не просто сделать переменную статической.

5. @Stan: Так что, возможно, графический интерфейс изначально не подходит для переменной. Вы вполне можете захотеть изменить представление вашего игрового состояния по сравнению с его моделью .

Ответ №2:

Если графический интерфейс и DrawPanel находятся в одном пакете, вы могли бы использовать

Gui.gamestate--

иначе вам придется объявить gamestate как общедоступный, а затем вызвать

Gui.gamestate--

Ответ №3:

Вы просто делаете это public как:

 public static int gamestate = 1;
  

и затем вы вызываете его статически:

 Gui.gamestate
  

Комментарии:

1. Я получаю сообщение об ошибке. Exception in thread "main" java.lang.IllegalArgumentException: adding container's parent to itself at java.awt.Container.checkAddToSelf(Unknown Source) at java.awt.Container.addImpl(Unknown Source) at javax.swing.AbstractButton.addImpl(Unknown Source) at java.awt.Container.add(Unknown Source) at collide.DrawPanel1.<init>(DrawPanel1.java:50) at collide.Gui.<init>(Gui.java:27) at collide.Gui.main(Gui.java:56)

2. @Stan кажется, что эта ошибка не зависит от другой, но компилятор только что обнаружил ее, поскольку другая была исправлена

Ответ №4:

Стандартный способ ООП передачи данных между классами — это использование методов получения / установки:

 class Gui {
    private int gameState;

    public void setGameState(int gameState) {
        this.gameState = gameState;
    }
}
  

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

Комментарии:

1. Ну, это мой main(): ` public static void main(строка[] аргументов){ Gui game = new Gui(); //МЕНЮ ЗАПУСКА if(gamestate == 1){ game.startgo(); } //ФАКТИЧЕСКАЯ ИГРА if(gamestate == 0){ game.go(); } } ` и, если я сделаю GameState int нестатическим, это выдаст мне эту ошибку: невозможно создать статическую ссылку на нестатическое поле GameState

2. Да, но почему вы обязательно должны обращаться к нему из статического метода?

3. Ну, не обязательно, но я решил начать все сначала, я перепутал много кода.