Как получить доступ к объектным переменным, сделанным из конструкторов - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть 2 кнопки, 1 использует класс конструктора для round1rock, а другая 1 пытается получить доступ к этим параметрам.Что не так с моим кодом?

Класс конструктора

public ROCK(int hp, int stamina, int attack, int speed, String type){
   this.hp=hp;  
   this.stamina= stamina;
   this.attack= attack;
   this.speed = speed;
   this.type = type;
}

2 кнопки:

private void continueRound1 (ActionEvent event){
       ROCK round1Rock= new ROCK( 500, 100, 100, 100, "Metamorphic");
    }
    private void Attack (ActionEvent event){
        round1Rock.hp = 12;

    }

как получить доступ к ранее созданному объекту?

Ответы [ 4 ]

3 голосов
/ 19 апреля 2019

Когда вы определяете

private void continueRound1 (ActionEvent event){
   ROCK round1Rock= new ROCK( 500, 100, 100, 100, "Metamorphic");
}

Вы определяете ROCK round1Rock только для функции continueRound1. Чтобы Attack получил доступ к этому объекту, вам нужно определить round1Rock на уровне класса.

Попробуйте:

ROCK round1Rock = null;

private void continueRound1 (ActionEvent event){
  round1Rock= new ROCK( 500, 100, 100, 100, "Metamorphic");
}
private void Attack (ActionEvent event){
    round1Rock.hp = 12;

}
0 голосов
/ 19 апреля 2019

Вместо создания нового объекта Rock в методе continueRound1.Вы можете создать новый объект Rock в области видимости класса и установить частный доступ.Это решит ваш вопрос.

Дополнительный совет: Вы создаете новый объект при каждом нажатии кнопки.Это приведет к OutOfMemoryError , если я напишу программу, которая нажимает кнопку бесконечно.

Ниже приведены мои идеи, чтобы избежать этой проблемы:

  1. Я предполагаю, что каждому клиенту нужен новый камень.Итак, создайте объект Empty Rock в классе клиента.
  2. В конструкторе Client вы можете инициализировать объект rock со значениями по умолчанию по типу rock.GetDefaultRockForType поможет вам создать столько типов камней, сколько вы хотите.Таким образом, мы скрываем детали реализации объекта rock с некоторыми значениями в клиентском классе до стандартного значения в классе Rock.

Вот мой фрагмент кода:

Class Client {
       private Rock round1Rock =  new Rock();
       Client() {
          round1Rock = round1Rock.getDefaultRockForType("Metamorphic"); 
       }
       private void continueRound1 (ActionEvent event){
            round1Rock= round1Rock.getDefaultRockForType("Metamorphic");
       }

    private void Attack (ActionEvent event){
        round1Rock.setHp(12);

    }
}

В вашем классе Rock вы можете указать значения по умолчанию, определяемые вашим типом камня.

Class Rock:

public Rock getDefaultRockForType(String type){
   if(type.equals("Metamorphic")){
         this.hp=500;  
         this.stamina= 100;
         this.attack= 100;
         this.speed = 100;
         this.type = type;
   }
}
0 голосов
/ 19 апреля 2019

Прежде всего объявите экземпляр ROCK глобальным, как этот

private ROCK round1Rock = null;
private void continueRound1 (ActionEvent event){
       round1Rock= new ROCK( 500, 100, 100, 100, "Metamorphic");
    }

    private void Attack (ActionEvent event){
        round1Rock.hp = 12;

    }

Во-вторых, в вашем слушателе действий Attack вы не можете получить доступ к переменной hp, потому что она может быть закрытой, поэтому лучше создать методы setter и getter для вашего класса Rock, а затем использовать это.

Рок Класс:

public ROCK(int hp, int stamina, int attack, int speed, String type){
   this.hp=hp;  
   this.stamina= stamina;
   this.attack= attack;
   this.speed = speed;
   this.type = type;
}

public void setHP(int hp){
   this.hp = hp
}

public void getHP(){
  return hp;
}

Тогда в вашем другом классе используйте это:

 private void Attack (ActionEvent event){
            round1Rock.setHP(12); //this will update the value

  }
0 голосов
/ 19 апреля 2019

Определить round1Rock на уровне класса,

class someclass

{

   private ROCK round1Rock;


          -----

   private void continueRound1 (ActionEvent event){
       round1Rock= new ROCK( 500, 100, 100, 100, "Metamorphic");
    }


    private void Attack (ActionEvent event){
        round1Rock.hp = 12;

    }

           ------
}
...