Как написать на Java систему аренды автомобилей
Источник: Medium Благодаря этой публикации вы узнаете, как создать простую систему аренды транспортных средств с использованием Java. В коде применены наследование, создание объектов и переопределение методов. Предположим, у нас есть иерархия классов с базовым классом Vehicle и тремя подклассами: Car, Motorcycle и Truck. Каждый тип транспортного средства в нашей системе аренды транспорта должен имеет свои уникальные атрибуты и методы. Также мы создадим класс RentalSystem для управления операциями по аренде, который позволит пользователям арендовать и возвращать транспортные средства. Для удобства понимания к соответствующей строке кода добавлены комментарии.Содержимое
1. Класс Vehicle
- Атрибуты: make, model, year, rentalRate.
- Методы: getMake(), getModel(), getRentalRate().
2. Подклассы (Car, Motorbike и Truck)
- наследуются от класса Vehicle.
- имеют уникальные атрибуты и переопределяют метод diaplayInfo().
3. Класс RentalSystem
- Содержит списки доступных и арендованных транспортных средств.
- Имеет методы добавления автомобиля, аренды автомобиля, возврата автомобиля, отображения информации об аренде.
- Рассчитывает общую стоимость аренды на основе продолжительности аренды и ставки аренды автомобиля.
4. RentalSystemDemo:
- Имеет метод main.
- Имеет удобный интерфейс для аренды, возврата и отображения информации об автомобиле.
Выполнение
Класс Vehicle (Суперкласс)
public class Vehicle {
private String make;
private String model;
private int year;
private double rentalRate;
public Vehicle(String make, String model, int year, double rentalRate) {
this.make = make;
this.model = model;
this.year = year;
this.rentalRate = rentalRate;
}
public void displayInfo() {
System.out.println("Make: " + make);
System.out.println("Model " + model);
System.out.println("Year: " + year);
System.out.println("Rental Rate: " + rentalRate);
}
public double getRentalRate() {
return rentalRate;
}
public String getMake() {
return make;
}
public String getModel() {
return model;
}
}
Подклассы (Car, Motorbike и Truck)
Car.java
public class Car extends Vehicle{
private int numDoors;
private boolean isConvertible;
private String fuelType;
public Car(String make, String model, int year, double rentalRate, int numDoors, boolean isConvertible, String fuelType) {
super(make, model, year, rentalRate);
this.numDoors = numDoors;
this.isConvertible = isConvertible;
this.fuelType = fuelType;
}
@Override
public void displayInfo() {
super.displayInfo();
System.out.println("Number of Doors: " + numDoors);
System.out.println("Convertible: " + isConvertible);
System.out.println("Fuel Type: " + fuelType);
}
}
Motorbike.java
public class Motorbike extends Vehicle{
private String bikeType;
public Motorbike(String make, String model, int year, double rentalRate, String bikeType) {
super(make, model, year, rentalRate);
this.bikeType = bikeType;
}
@Override
public void displayInfo() {
super.displayInfo();
System.out.println("Bike Type" + bikeType);
}
}
Truck.java
public class Truck extends Vehicle{
private int loadCapacity;
private boolean isFourWheelDrive;
private String cargoType;
public Truck(String make, String model, int year, double rentalRate, int loadCapacity, boolean isFourWheelDrive, String cargoType) {
super(make, model, year, rentalRate);
this.loadCapacity = loadCapacity;
this.isFourWheelDrive = isFourWheelDrive;
this.cargoType = cargoType;
}
@Override
public void displayInfo() {
super.displayInfo();
System.out.println("Load Capacity: " + loadCapacity);
System.out.println("Four wheel drive: " + isFourWheelDrive);
System.out.println("Cargo type: " + cargoType);
}
}
Класс RentalSystem
import java.util.ArrayList;
import java.util.List;
public class RentalSystem {
private List<Vehicle> availableVehicles;
private List<Vehicle> rentedVehicles;
public RentalSystem() {
availableVehicles = new ArrayList<>();
rentedVehicles = new ArrayList<>();
}
// для добавления транспортных средств в систему аренды
public void addVehicle(Vehicle vehicle) {
availableVehicles.add(vehicle);
}
public List<Vehicle> getAvailableVehicles(){
return availableVehicles;
}
public List<Vehicle> getRentedVehicles(){
return rentedVehicles;
}
// для аренды автомобиля
public void rentVehicle(Vehicle vehicle) {
if(availableVehicles.contains(vehicle)) {
availableVehicles.remove(vehicle);
rentedVehicles.add(vehicle);
}
}
// чтобы вернуть арендованный автомобиль
public void returnVehicle(Vehicle vehicle) {
if(rentedVehicles.contains(vehicle)) {
rentedVehicles.remove(vehicle);
availableVehicles.add(vehicle);
}
}
// Для отображения доступных и арендованных транспортных средств
public void displayRentalInfo() {
System.out.println("Available vehicles: ");
for(Vehicle av : availableVehicles) {
av.displayInfo();
System.out.println();
}
System.out.println("Rented vehicles: ");
for(Vehicle rv : rentedVehicles) {
rv.displayInfo();
System.out.println();
}
}
// Для расчета общей стоимости аренды
public double calculateRentalCost(Vehicle vehicle, int rentalDuration) {
double rentalRate = vehicle.getRentalRate();
double totalCost = rentalRate * rentalDuration;
return totalCost;
}
}
Основное приложение (RentalSystemDemo.java)
import java.util.Scanner;
public class Test1Demo {
public static void main(String[] args) {
// Создание объекта scanner для получения пользовательского ввода
Scanner scanner = new Scanner(System.in);
// Создание объекта RentalSystem, который используется для вызова соответствующих методов
RentalSystem rentalSystem = new RentalSystem();
Vehicle car = new Vehicle("Toyota", "Supra", 2020, 100);
Vehicle motorbike = new Vehicle("Honda", "CXR", 2000, 50);
Vehicle truck = new Vehicle("Ford", "F150", 2001, 200);
rentalSystem.addVehicle(car);
rentalSystem.addVehicle(motorbike);
rentalSystem.addVehicle(truck);
while (true) {
// Параметры для пользователя
System.out.println();
System.out.println("===== Vehicle Rental System =====");
System.out.println("1. Rent a Vehicle");
System.out.println("2. Return a Vehicle");
System.out.println("3. Display Rental Information");
System.out.println("4. Exit");
System.out.println();
System.out.print("Enter your choice: ");
int choice = scanner.nextInt();
scanner.nextLine();
switch (choice) {
case 1: {
// Арендуем транспортное средство
System.out.print("Enter the vehicle make: ");
String make = scanner.nextLine();
System.out.print("Enter the vehicle model: ");
String model = scanner.nextLine();
Vehicle selectedVehicle = null;
// Проверяем наличие транспортного средства среди доступных к аренде
for(Vehicle v : rentalSystem.getAvailableVehicles()) {
if(v.getMake().equalsIgnoreCase(make) && v.getModel().equalsIgnoreCase(model)) {
selectedVehicle = v;
}
}
if(selectedVehicle != null) {
// Добавляем транспортное средство к списку арендованных
rentalSystem.rentVehicle(selectedVehicle);
System.out.print("Enter the rental duration in days: ");
int rentalDuration = scanner.nextInt();
// Рассчитываем общую стоимость аренды
double rc = rentalSystem.calculateRentalCost(selectedVehicle, rentalDuration);
System.out.println("Successfully rented.");
System.out.println("Total rental Cost: " + rc);
}
else {
System.out.println("Matching vehicle is not available for rent.");
}
break;
}
case 2: {
// Возврат транспортного средства
System.out.println("Enter the vehicle make: ");
String make = scanner.nextLine();
System.out.println("Enter the vehicle model: ");
String model = scanner.nextLine();
Vehicle selectedVehicle = null;
// Проверяем транспортное средство из числа арендованных
for(Vehicle v : rentalSystem.getRentedVehicles()) {
if(v.getMake().equalsIgnoreCase(make) && v.getModel().equalsIgnoreCase(model)) {
selectedVehicle = v;
}
}
if(selectedVehicle != null) {
// Добавить к возвращенным автомобилям
rentalSystem.returnVehicle(selectedVehicle);
System.out.println("Vehicle returned successfully.");
}
else {
System.out.println("Invalid return. Vehicle not rented.");
}
}
case 3: {
// Отобразить информацию об аренде
rentalSystem.displayRentalInfo();
break;
}
case 4: {
// Выход
System.out.println("Thank you for using the Vehicle Rental System. Goodbye!");
scanner.close();
System.exit(0);
}
default:
System.out.println("Invalid choice. Please enter valid option...");
}
}
}
}
Вывод
Вариант 1: Арендовать автомобиль
Арендованный автомобиль Toyota.===== Vehicle Rental System =====
1. Rent a Vehicle
2. Return a Vehicle
3. Display Rental Information
4. Exit
Enter your choice: 1
Enter the vehicle make: toyota
Enter the vehicle model: supra
Enter the rental duration in days: 15
Successfully rented.
Total rental Cost: 1500.0
===== Vehicle Rental System =====
1. Rent a Vehicle
2. Return a Vehicle
3. Display Rental Information
4. Exit
Enter your choice:
Вариант 3: Отображение информации об аренде
Toyota теперь добавлена в раздел “Арендованные автомобили”.Enter your choice: 3
Available vehicles:
Make: Honda
Model CXR
Year: 2000
Rental Rate: 50.0
Make: Ford
Model F150
Year: 2001
Rental Rate: 200.0
Rented vehicles:
Make: Toyota
Model Supra
Year: 2020
Rental Rate: 100.0
===== Vehicle Rental System =====
1. Rent a Vehicle
2. Return a Vehicle
3. Display Rental Information
4. Exit
Enter your choice:
Вариант 2: Возврат автомобиля
Toyota успешно возвращается, и все доступные автомобили возвращаются.Enter your choice: 2
Enter the vehicle make:
toyota
Enter the vehicle model:
supra
Vehicle returned successfully.
Available vehicles:
Make: Honda
Model CXR
Year: 2000
Rental Rate: 50.0
Make: Ford
Model F150
Year: 2001
Rental Rate: 200.0
Make: Toyota
Model Supra
Year: 2020
Rental Rate: 100.0
Rented vehicles:
===== Vehicle Rental System =====
1. Rent a Vehicle
2. Return a Vehicle
3. Display Rental Information
4. Exit
Enter your choice:
Я надеюсь, что эта статья поможет вам лучше понять наследование с помощью практического сценария. Приятного кодирования :)
Как Java Reflection и функциональные интерфейсы повышают эффективность разработки
Источник: Medium В Java существуют две великолепные функции, с которыми должен быть знаком каждый разработчик, — это Java Reflection и функциональные интерфейсы. Из этой публикации вы узнаете о том, для чего они нужны и как их использовать с максимальной эффективностью.Java Reflection — что это такое?
Reflection — это мощная функция в Java, которая позволяет программе исследовать или анализировать саму себя во время выполнения. Она предоставляет способ доступа к информации уровня класса и динамического управления полями, методами и конструкторами класса. Это означает, что вы можете проверять и изменять структуру вашего кода во время его работы.Как использовать Java Reflection?
Использование Reflection обычно включает в себя три ключевых шага:Получение объекта Class. Вы можете получить объект Class, который представляет класс или интерфейс, используя синтаксис .class или вызывая объект getClass().
Class<?> myClass = MyClass.class;
Проверка информации о классе. Если у вас есть объект Class, вы можете запросить у него информацию о полях, методах и конструкторах класса.
Field[] fields = myClass.getDeclaredFields(); Method[] methods = myClass.getDeclaredMethods(); Constructor<?>[] constructors = myClass.getDeclaredConstructors();
Вызов методов или полей доступа. Вы можете вызывать методы или динамически получать доступ к полям.
Method method = myClass.getDeclaredMethod("methodName", parameterTypes); Object result = method.invoke(instance, args); Field field = myClass.getDeclaredField("fieldName"); field.setAccessible(true); Object value = field.get(instance);
Варианты использования Java Reflection
- Динамическая загрузка: Reflection позволяет динамически загружать классы во время выполнения, что может быть полезно в сценариях, когда вы хотите расширить функциональность вашего приложения без перекомпиляции.
- Сериализация и десериализация. Такие платформы, как сериализация объектов Java или библиотеки JSON, используют Reflection для преобразования объектов в байты или JSON и наоборот.
- Инструменты тестирования и отладки. Reflection используется в различных инструментах тестирования и отладки для анализа классов и объектов и управления ими во время выполнения.
- Внедрение зависимостей и автоконфигурация. Spring Boot в значительной степени опирается на концепцию внедрения зависимостей и автоконфигурации. Reflection используется для идентификации и создания экземпляров bean-компонентов, внедрения зависимостей и автоматической настройки компонентов. Проверяя классы и их аннотации во время выполнения, Spring Boot может соединить компоненты вашего приложения без необходимости явной настройки.
Что такое функциональные интерфейсы?
Функциональные интерфейсы — это интерфейсы в Java, имеющие ровно один абстрактный метод. Они служат основой для лямбда-выражений, обеспечивая более функциональный стиль программирования на Java.Как использовать функциональные интерфейсы?
Объявление функционального интерфейса. Вы можете создать свой собственный функциональный интерфейс или использовать его из стандартной библиотеки Java.
@FunctionalInterface interface MyFunctionalInterface { void myMethod(); }
Лямбда-выражения. Лямбда-выражения предоставляют краткий способ реализации единого абстрактного метода функционального интерфейса.
MyFunctionalInterface myLambda = () -> System.out.println("Hello, Lambda!"); myLambda.myMethod();
Варианты использования функциональных интерфейсов
- Stream API: Функциональные интерфейсы являются фундаментальными в Java Stream API, поскольку позволяют обрабатывать коллекции данных в функциональном стиле.
- Обработка событий ActionListener: они широко используются при обработке событий, когда необходимо реализовать один метод, например ActionListener.
- Параллельное программирование. Функциональные интерфейсы играют решающую роль в параллельном программировании с такими конструкциями, как Runnable или Callable.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ