[英]Simple Object class and records
我目前正在学习Java,并且已经完成了一些教程。 但是,每个练习都集中在一个部分上(例如学习IO,学习String,图形等),但是只有少数几个部分之间混有多个章节。 这意味着我很难编写一个更完整但仍然很简单的程序。
请在我的问题下方查看。 我正在创建一个“汽车类”,在其中创建了4个变量。 我为用户提供了插入汽车类型,年份和其他两个选项的选项。 设置所有值后,我们将显示它们。 到目前为止(几乎)良好。
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class Car {
String make;
String model;
int year;
String plateNumber;
public Car() {
}
// SETS and GETS the type of the Car
public void setMake (Scanner in) {
make = in.nextLine();
}
public String getMake () {
System.out.print("Make: " + make);
return make;
}
// SETS and GETS the model of the Car
public void setModel (Scanner in) {
model = in.nextLine();
}
public String getModel () {
System.out.print("Model: " + model);
return model;
}
// SETS and GETS the year of fabrication
public void setYear(Scanner in) {
year = in.nextInt();
}
public int getYear () {
System.out.print("Year: " + year);
return year;
}
// SETS and GETS the plateNumber;
public void setPlate (Scanner in) {
plateNumber = in.nextLine();
}
public String getPlate ()
{
System.out.print("License: " + plateNumber);
return plateNumber;
}
public static void main(String[] args) throws IOException {
File file = new File("");
Scanner in = new Scanner(System.in);
if (!file.exists()) {
FileWriter writeFile = new FileWriter("cars.txt");
}
// CAR 1 ====================
Car car1 = new Car();
System.out.println("Car1: ");
car1.setMake(in);
car1.getMake();
car1.setModel(in);
car1.getModel();
car1.setYear(in);
car1.getYear();
Car [] cars = new Car [5]; // Creates a 5 car array / parking lot
}
}
此后,它将数据存储在[5] Car Array中,然后将其保存到外部txt文件中。 解决以下两点后,我将添加到文件保存。
现在的问题:
当您更改getter而不打印值并更改getter和setter执行的顺序时,可以达到以下目的:
//other code public String getModel () { System.out.print("Model: "); return model; } //other code public static void main(String[] args) { //other code System.out.println("Car1: "); car1.getMake(); car1.setMake(in); car1.getModel(); car1.setModel(in); car1.getYear(); car1.setYear(in); //other code }
关于第二个问题,您可以像其他数组一样创建Car对象数组,并轻松访问数组元素字段:
public static void main(String[] args) { //other code Car [] cars = new Main [5]; cars[0] = car1; System.out.println(cars[0].getMake()); System.out.println(cars[0].getModel()); }
创建汽车数组的方式与创建String数组的方式相同。
Car carArray[] = new Car[sizeofarray];
carArray[i] = car1;
阅读同样:
for(int i = 0; i < carArray.length; i++){
carArray[i].getModel(); // do something here
}
另外,将Scanner作为参数传递给setter也不是一个好习惯。 设置器应采用与字段相同类型的参数。 根据您的示例,而不是这样做:
car1.setMake(in);
你做这个:
car1.setMake(in.nextLine());
为了获得更好的打印效果,只需要先打印文字,然后等待用户输入,就不要重新打印输入内容。
1.您当然可以先接受输入,然后显示输入的数据。 所以,
car1.setMake(in);
car1.setModel(in);
car1.setYear(in);
car1.getMake();
car1.getModel();
car1.getYear();
并更改设置器方法以提示消息输入内容,
public void setMake (Scanner in) {
System.out.println("Enter Model : ");
make = in.next();
}
2.此处的ArrayList比array更好,因为您可能不知道汽车数量。 您可以列出汽车列表,然后分别调用该方法以获得预期的结果。
ArrayList<Car> carList = new ArrayList<Car>();
carList.add(car1);
//Call the get(index) method to get the car object and then call the class method you want.
carList.get(0).getMake();
carList.get(0).getModel();
//A class always should have a toString() method that returns the string with all the values of class instance.
System.out.println(carList.get(0).toString());
另外,对Car类使用toString方法来获取该类所有实例的值。
@Override
public String toString() {
return "Car [make=" + make + ", model=" + model + ", year=" + year + ", plateNumber=" + plateNumber + "]";
}
您应该使用Car类的构造函数来设置模型,年份等。 从用户那里获取Car信息,将其保存,然后将其传递给构造函数。
像这样:
public Car( String make, String model, int year) {
this.make = make;
//set the values here
}
在您的主要方法中:
String make = in.nextLine();
// You can prompt the user for the car info and then assign the value respectively. Then pass it to the constructor
Car car1 = new Car(make,model,year);
如果要创建汽车对象的数组,请进行while-loop
Car cars= new Car[5];
int i=0;
While(i<5){
//ask user for input
.
.
.
cars[i] = new Car(make,model,year);
}
使用System.out.println(); 为吸气剂而不是.print()使它看起来更好。 要将汽车添加到汽车[],请使用汽车[x] = car.x + 1;
这是个有趣的问题。 似乎有许多不同的方法可以解决此问题。 @NimitPatel提出的建议是个好主意。 您也可以尝试这样的操作,以保持当前设计的完整性。
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
public class Car {
String make;
String model;
int year;
String plateNumber;
public Car() {
}
// SETS and GETS the type of the Car
public void setMake (Scanner in) {
make = in.nextLine();
}
public String getMake () {
System.out.print("Make: " + make);
return make;
}
// SETS and GETS the model of the Car
public void setModel (Scanner in) {
model = in.nextLine();
}
public String getModel () {
System.out.print("Model: " + model);
return model;
}
// SETS and GETS the year of fabrication
public void setYear(Scanner in) {
year = in.nextInt();
}
public int getYear () {
System.out.print("Year: " + year);
return year;
}
// SETS and GETS the plateNumber;
public void setPlate (Scanner in) {
plateNumber = in.nextLine();
}
public String getPlate ()
{
System.out.print("License: " + plateNumber);
return plateNumber;
}
public static void main(String[] args) throws IOException {
File file = new File("");
Scanner in = new Scanner(System.in);
if (!file.exists()) {
FileWriter writeFile = new FileWriter("cars.txt");
}
Car [] cars = new Car [5]; // Creates a 5 car array / parking lot
for(int i = 0; i < 5; i++)
{
Car myCar = new Car();
System.out.println("Enter information for Car" + (i + 1) + ":");
System.out.println();
System.out.print("Car" + (i + 1) + ": ");
myCar.setMake(in);
System.out.print("Model: ");
myCar.setModel(in);
System.out.print("Year: ");
in.nextLine();
System.out.println();
cars[i] = myCar;
}
}
}
如果可能的话,我强烈建议您更改设计。 在短期内,这似乎是不必要的,对于小型项目而言,这可能是非常好的,但是如果您打算在以后使用充满Car
对象的cars[]
数组,则进行较小的重新设计可能会使您的代码更容易编写读。
一个主要建议是创建一个独立的Car
类。 此类仅包含有关汽车的逻辑,如何设置有关汽车的信息以及如何从汽车中获取信息。 也许是这样的:
public class Car
{
private String make;
private String model;
private String plateNumber;
private int year;
// Constructor
public Car()
{
}
// SETS and GETS the type of the Car
public void setMake (String make)
{
this.make = make;
}
public String getMake ()
{
return make;
}
// SETS and GETS the model of the Car
public void setModel (String model)
{
this.model = model;
}
public String getModel ()
{
return model;
}
// SETS and GETS the year of fabrication
public void setYear(int year)
{
this.year = year;
}
public int getYear ()
{
return year;
}
// SETS and GETS the plateNumber;
public void setPlateNumber (String plateNumber)
{
this.plateNumber = plateNumber;
}
public String getPlateNumber ()
{
return plateNumber;
}
}
然后,您的主类将负责从用户那里获取信息,使用该信息来创建新的汽车,并将这些汽车放入array或arrayList中。 可能是这样的:
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
String make, model;
int year;
Car cars[] = new Car[3];
// Get information about cars from the user
// Use this information to create a car
// Store this car in the array
for(int i = 0; i < cars.length; i++)
{
System.out.println("Enter information for car " + (i + 1));
make = getMakeFromUser();
model = getModelFromUser();
year = getYearFromUser();
Car myCurrentCar = new Car();
myCurrentCar.setMake(make);
myCurrentCar.setModel(model);
myCurrentCar.setYear(year);
cars[i] = myCurrentCar;
System.out.println();
}
// Display information about cars from the array
for(int i = 0; i < cars.length; i++)
{
System.out.println("Information about car " + (i + 1));
System.out.println("Make: " + cars[i].getMake());
System.out.println("Model: " + cars[i].getModel());
System.out.println("Year: " + cars[i].getYear());
System.out.println();
}
}
static String getMakeFromUser()
{
String make;
Scanner in = new Scanner(System.in);
System.out.print("Make: ");
make = in.nextLine();
return make;
}
static int getYearFromUser()
{
int year;
Scanner in = new Scanner(System.in);
System.out.print("Year: ");
year = in.nextInt();
in.nextLine();
return year;
}
static String getModelFromUser()
{
String model;
Scanner in = new Scanner(System.in);
System.out.print("Model: ");
model = in.nextLine();
return model;
}
}
其背后的想法与“单一责任原则”有关。 如果您正在编写汽车代码,是希望汽车代码知道如何要求用户输入,还是希望汽车代码仅知道如何跟踪有关汽车的信息。 关于此原理的优秀视频可以在这里找到。 希望这不会使事情复杂化。 祝你好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.