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