Получение переменных из конструктора Java

#java #constructor

#java #constructor

Вопрос:

Я новичок в программировании на Java, извините, если это глупый вопрос.

Мне трудно правильно сформулировать этот вопрос, но у меня есть задание создать класс aircraft, который может выполнять посадку самолета, взлет и т.д. И нужно протестировать это с помощью Testclass. Когда вводится новый объект, он автоматически присваивает самолету уникальный идентификатор в конструкторе.

Я могу сделать это, используя метод экземпляра, поскольку он имеет возвращаемое значение, которое возвращается в to Testclass. Вопрос хочет, чтобы я сделал это в самом конструкторе, однако конструктор никогда ничего не возвращает. Таким образом, переменная никогда не отправляется в Testclass. Я явно неправильно понимаю ООП. Даже когда я пытаюсь просто использовать getter метод для получения идентификатора, созданного в конструкторе, он выдает мне инициализированную переменную до того, как конструктор поработает над этим. Это код, который у меня есть до сих пор, и я знаю, что он совершенно неправильный, но если бы кто-нибудь мог указать мне правильное направление или сказать, как лучше сформулировать этот вопрос, это было бы огромной помощью.

 // I need to enter 3 aircraft into the system in the testclass

public class Aircraft {

  private int aircraftID;
  private static int lastID;
  private String airportcode;
  private int ID = 100;

  private int count;



  public Aircraft(int a, int b, int c){
    // Constructor


     // Assign ID
     this.ID = a;
     lastID = ID;
     ID  ;

     this.ID =b;
     lastID = ID;
     ID  ;
  }
}
  

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

1. Вы не можете ничего вернуть из конструктора. Итак, вопрос некорректен или вы неправильно поняли вопрос. Конструктор не имеет возвращаемого типа и используется, когда вы это делаете Aircraft aircraft = new Aircraft(1, 2, 3); поэтому я полагаю, что он возвращает вам экземпляр Aircraft , если вы хотите посмотреть на это таким образом

2. Ваше разочарование очевидно и понятно; мы все это проходили. Когда вы говорите, что вам сказали протестировать это с помощью Testclass, вы имеете в виду построение модульных тестов?

3. Я думаю, что я неправильно выразился, и это не тестовый класс, а модульный тест. При вводе новых самолетов (объектов) им будет присвоен уникальный идентификатор. Итак, когда я использую Aircraft ac = new Aircraft(); это предназначено для выполнения вышеуказанного, тогда я думаю. Да, мое разочарование больше связано с тем, что я не знаю, как / что гуглить / спрашивать, мой лектор сказал, что ООП — это сложная концепция, но как только вы ее получите, она у вас будет.

4. Извините за редактирование моего ответа; я торопился. * facepalm*

Ответ №1:

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

 private class Aircraft {

    private static int staticId = 0;
    private int uniqueId = 0;
    private boolean onGround = true; // Aircraft start on the ground in this implementation

    public Aircraft(){
        this.uniqueId = staticId; // putting this line first makes uniqueId zero-indexed in effect
        staticId  ;
    }

    public void land(){
        onGround = true;
    }

    public void takeoff(){
        onGround = false;
    }

    public boolean isFlying(){
        return !onGround; // If it's not on the ground, it's flying
    }

    public int getUniqueId(){
        return uniqueId;
    }
}
  

Модульные тесты проверяют все методы и ожидаемую функциональность рассматриваемого класса:

 import org.junit.Test;
import static org.junit.Assert.*;
import Aircraft;

class Testclass {

    private final Aircraft aircraft = new Aircraft();

    @Test
    public void hasId(){
        aircraft.getUniqueId() >= 0;
    }

    @Test
    public void canLand(){
        assertTrue(aircraft.land());
    }

    @Test
    public void canTakeOff(){
        assertTrue(aircraft.takeOff());
    }

    @Test
    public void checkFlightOperationsAreTrackedCorrectly(){
        aircraft.land();
        assertFalse(aircraft.isFlying());
        aircraft.takeOff();
        assertTrue(aircraft.isFlying());
    }
}
  

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

1. Честно говоря, большое вам за это спасибо. Вы ответили на другой вопрос, на который мне нужен был ответ с помощью этого кода. Я действительно ценю это. Я думаю, что теперь я начинаю понимать больше, когда я создаю Aircraft, который в основном похож на тип данных, и мне нужно описать этот тип данных в коде, тогда как с конструктором я просто кодировал его как обычный метод. Большое спасибо, Билл!

2. Всегда пожалуйста! Я рад помочь. Обратите внимание, что вам действительно следует добавить документацию к классу Aircraft (тестовые классы должны быть самодокументируемыми.) И не стесняйтесь принять мой ответ. 🙂

Ответ №2:

Как указывалось, конструктор ничего не возвращает (упрощенная версия заключается в том, что с new он возвращает экземпляр объекта). Я как бы догадываюсь, что вы пытаетесь выполнить, но я все равно попробую. Мне кажется, что вы пытаетесь втиснуть построение 3 объектов в один конструктор — вот почему ваш конструктор имеет 3 параметра. Кроме того, вы разыгрываете хаос с идентификаторами.

Я удалил все переменные, которые я не совсем понял, оставив только идентификатор, который увеличивается с каждым созданным экземпляром Aircraft . @Override Это в основном просто для галочки.

 public class Aircraft {
    private int aircraftID;
    private static int lastID = 0;

    @Override
    public String toString(){
        return "Aircraft_"   this.aircraftID;
    }

    public Aircraft() {
        lastID  ;
        this.aircraftID = lastID;
    }
}
  

Я взял на себя смелость и написал TestClass просто чтобы посмотреть, имеем ли мы в виду одно и то же. Снова printAircraft() метод предназначен для демонстрации.

 public class TestClass {
    private List<Aircraft> aircrafts;
    public TestClass(){
        aircrafts = new ArrayList<>();
    }

    public void addAircraft(Aircraft a){
        aircrafts.add(a);
    }

    public void printAircraft(){
        Iterator<Aircraft> it = aircrafts.iterator();
        while(it.hasNext()){
            System.out.println(it.next().toString());
        }
    }
}
  

и чтобы протестировать это, мы создаем экземпляр и TestClass добавляем 3 Aircraft экземпляра и распечатываем содержимое

 public static void main(String[] args) {
    TestClass tc = new TestClass();
    tc.addAircraft(new Aircraft());
    tc.addAircraft(new Aircraft());
    tc.addAircraft(new Aircraft());
    tc.printAircraft();
}
  

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

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

1. Вау, потрясающе, большое вам спасибо. Я действительно считаю, что неправильно сформулировал это в вопросе в том смысле, что мне нужно создать модульный тест, а не тестовый класс. Но это здорово — пройтись по чьему-то коду и понять, что происходит, так что спасибо!