Как написать на Java систему аренды автомобилей

Источник: Medium Благодаря этой публикации вы узнаете, как создать простую систему аренды транспортных средств с использованием Java. В коде применены наследование, создание объектов и переопределение методов. Кофе-брейк #258. Как написать на Java систему аренды автомобилей. Как Java Reflection и функциональные интерфейсы повышают эффективность разработки - 1Предположим, у нас есть иерархия классов с базовым классом 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 обычно включает в себя три ключевых шага:
  1. Получение объекта Class. Вы можете получить объект Class, который представляет класс или интерфейс, используя синтаксис .class или вызывая объект getClass().

    
    Class<?> myClass = MyClass.class;
    
  2. Проверка информации о классе. Если у вас есть объект Class, вы можете запросить у него информацию о полях, методах и конструкторах класса.

    
    Field[] fields = myClass.getDeclaredFields();
    Method[] methods = myClass.getDeclaredMethods();
    Constructor<?>[] constructors = myClass.getDeclaredConstructors();
    
  3. Вызов методов или полей доступа. Вы можете вызывать методы или динамически получать доступ к полям.

    
    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

  1. Динамическая загрузка: Reflection позволяет динамически загружать классы во время выполнения, что может быть полезно в сценариях, когда вы хотите расширить функциональность вашего приложения без перекомпиляции.
  2. Сериализация и десериализация. Такие платформы, как сериализация объектов Java или библиотеки JSON, используют Reflection для преобразования объектов в байты или JSON и наоборот.
  3. Инструменты тестирования и отладки. Reflection используется в различных инструментах тестирования и отладки для анализа классов и объектов и управления ими во время выполнения.
  4. Внедрение зависимостей и автоконфигурация. Spring Boot в значительной степени опирается на концепцию внедрения зависимостей и автоконфигурации. Reflection используется для идентификации и создания экземпляров bean-компонентов, внедрения зависимостей и автоматической настройки компонентов. Проверяя классы и их аннотации во время выполнения, Spring Boot может соединить компоненты вашего приложения без необходимости явной настройки.

Что такое функциональные интерфейсы?

Функциональные интерфейсы — это интерфейсы в Java, имеющие ровно один абстрактный метод. Они служат основой для лямбда-выражений, обеспечивая более функциональный стиль программирования на Java. Кофе-брейк #258. Как написать на Java систему аренды автомобилей. Как Java Reflection и функциональные интерфейсы повышают эффективность разработки - 2

Как использовать функциональные интерфейсы?

  1. Объявление функционального интерфейса. Вы можете создать свой собственный функциональный интерфейс или использовать его из стандартной библиотеки Java.

    
    @FunctionalInterface
    interface MyFunctionalInterface {
        void myMethod();
    }
    
  2. Лямбда-выражения. Лямбда-выражения предоставляют краткий способ реализации единого абстрактного метода функционального интерфейса.

    
    MyFunctionalInterface myLambda = () -> System.out.println("Hello, Lambda!");
    myLambda.myMethod();
    

Варианты использования функциональных интерфейсов

  1. Stream API: Функциональные интерфейсы являются фундаментальными в Java Stream API, поскольку позволяют обрабатывать коллекции данных в функциональном стиле.
  2. Обработка событий ActionListener: они широко используются при обработке событий, когда необходимо реализовать один метод, например ActionListener.
  3. Параллельное программирование. Функциональные интерфейсы играют решающую роль в параллельном программировании с такими конструкциями, как Runnable или Callable.

Эффективность функциональных интерфейсов

Сами по себе функциональные интерфейсы не несут затрат в производительности. Однако использование лямбда-выражений может привести к небольшим накладным расходам по сравнению с традиционными анонимными внутренними классами. Эти накладные расходы обычно незначительны и компенсируются повышенной читабельностью и краткостью.

Заключение

Java Reflection и функциональные интерфейсы — это две мощные функции, которые обеспечивают необходимый уровень гибкости и выразительности, чем значительно улучшают код. Освоив эти функции и поняв соответствующие варианты их использования, вы сможете поднять свои навыки программирования на Java на новую высоту. Помните, что с большой мощностью приходит и большая ответственность, поэтому используйте эти функции разумно и учитывайте их влияние на эффективность в сценариях, где производительность критически важна. Приятного кодирования!