Как называется придание объекту определенных свойств
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Придание объекту определённых свойств (Инкапсуляция и Полиморфизм)
В объектно-ориентированном программировании процесс придания объекту определённых свойств и поведения называется несколькими терминами в зависимости от контекста.
1. Инкапсуляция (Encapsulation)
Это основной принцип OOP, который предусматривает определение свойств и методов объекта через:
public class User {
// Приватные свойства (инкапсуляция)
private String name;
private int age;
private String email;
private boolean active;
// Публичные методы доступа (getter/setter)
public String getName() {
return name;
}
public void setName(String name) {
if (name != null && !name.isEmpty()) {
this.name = name;
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 0 && age < 150) {
this.age = age;
}
}
}
Инкапсуляция скрывает внутреннюю реализацию и предоставляет контролируемый доступ.
2. Инициализация (Initialization)
Процесс установки начальных значений свойств объекта при его создании:
public class Product {
private String id;
private String name;
private BigDecimal price;
private LocalDateTime createdAt;
// Конструктор инициализирует свойства
public Product(String id, String name, BigDecimal price) {
this.id = id;
this.name = name;
this.price = price;
this.createdAt = LocalDateTime.now();
}
// Или через Builder для сложных случаев
public static class Builder {
private String id;
private String name;
private BigDecimal price;
private LocalDateTime createdAt = LocalDateTime.now();
public Builder id(String id) {
this.id = id;
return this;
}
public Product build() {
return new Product(id, name, price);
}
}
}
3. Конфигурирование (Configuration)
Установка свойств объекта на основе параметров или конфигурации:
@Configuration
@ConfigurationProperties(prefix = "app")
@Data
public class ApplicationConfig {
private String appName;
private int maxConnections;
private boolean debugMode;
private List<String> allowedOrigins;
// Свойства конфигурируются через YAML или properties файлы
}
// application.yml
// app:
// appName: MyApplication
// maxConnections: 100
// debugMode: false
// allowedOrigins:
// - http://localhost:3000
// - https://example.com
4. Аннотирование (Annotation)
Использование аннотаций для определения свойств объекта:
@Entity
@Table(name = "users")
@Data
public class UserEntity {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private String id;
@Column(name = "full_name", nullable = false)
private String name;
@Column(unique = true)
@Email
private String email;
@NotNull
@Min(18)
@Max(120)
private Integer age;
@CreationTimestamp
private LocalDateTime createdAt;
@UpdateTimestamp
private LocalDateTime updatedAt;
}
5. Полиморфизм (Polymorphism)
Придание объекту свойств различных типов через интерфейсы и абстрактные классы:
// Интерфейс определяет свойства
public interface PaymentProcessor {
void processPayment(BigDecimal amount);
String getProcessorName();
boolean isAvailable();
}
// Разные реализации со своими свойствами
public class CreditCardProcessor implements PaymentProcessor {
private String cardNumber;
private String cvv;
private LocalDate expiryDate;
@Override
public void processPayment(BigDecimal amount) {
// Специфичная для кредитной карты логика
}
@Override
public String getProcessorName() {
return "Credit Card";
}
}
public class PayPalProcessor implements PaymentProcessor {
private String paypalEmail;
private String accessToken;
@Override
public void processPayment(BigDecimal amount) {
// Специфичная для PayPal логика
}
@Override
public String getProcessorName() {
return "PayPal";
}
}
6. Композиция (Composition)
Придание объекту свойств через встраивание других объектов:
public class Order {
private String orderId;
// Композиция: объект содержит другие объекты
private Customer customer;
private List<OrderItem> items;
private Address shippingAddress;
private PaymentInfo paymentInfo;
public Order(Customer customer, Address shippingAddress) {
this.customer = customer;
this.shippingAddress = shippingAddress;
this.items = new ArrayList<>();
}
}
public class Customer {
private String id;
private String name;
private ContactInfo contactInfo;
}
public class ContactInfo {
private String email;
private String phone;
}
7. Наследование (Inheritance)
Передача свойств от родительского класса к дочернему:
// Родительский класс определяет базовые свойства
public abstract class Vehicle {
protected String brand;
protected String model;
protected int year;
protected BigDecimal price;
public Vehicle(String brand, String model, int year) {
this.brand = brand;
this.model = model;
this.year = year;
}
abstract void startEngine();
}
// Дочерний класс наследует и расширяет свойства
public class Car extends Vehicle {
private int numberOfDoors;
private String fuelType;
public Car(String brand, String model, int year, int doors, String fuel) {
super(brand, model, year);
this.numberOfDoors = doors;
this.fuelType = fuel;
}
@Override
void startEngine() {
System.out.println("Car engine started");
}
}
8. Мутация и Неизменяемость (Mutability)
Управление изменяемостью свойств:
// ❌ Изменяемый объект
public class MutableUser {
public String name; // Публичное поле
public int age; // Легко изменить
}
// ✅ Неизменяемый объект
public final class ImmutableUser {
private final String name;
private final int age;
public ImmutableUser(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
// Для изменения создаём новый объект
public ImmutableUser withName(String newName) {
return new ImmutableUser(newName, this.age);
}
}
// Использование
ImmutableUser user1 = new ImmutableUser("John", 30);
ImmutableUser user2 = user1.withName("Jane"); // Новый объект
9. Интроспекция (Introspection)
Получение информации о свойствах объекта во время выполнения:
public class ReflectionHelper {
public static void printProperties(Object obj) {
Class<?> clazz = obj.getClass();
// Получить все поля
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
try {
String name = field.getName();
Object value = field.get(obj);
System.out.println(name + ": " + value);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
// Использование
User user = new User("John", 30, "john@example.com");
ReflectionHelper.printProperties(user);
10. Лучшие практики для определения свойств
@Data // Lombok генерирует getters, setters, equals, hashCode
@Entity
@Table(name = "products")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private String id;
@NotBlank(message = "Name is required")
@Column(nullable = false)
private String name;
@NotNull
@DecimalMin("0.01")
private BigDecimal price;
@Positive
private Integer stock;
@CreationTimestamp
@Column(updatable = false)
private LocalDateTime createdAt;
@UpdateTimestamp
private LocalDateTime updatedAt;
// Вычисляемое свойство
public boolean isInStock() {
return stock != null && stock > 0;
}
}
Терминология
- Инкапсуляция — скрытие деталей реализации
- Инициализация — установка начальных значений
- Конфигурирование — установка свойств через конфиг
- Аннотирование — использование аннотаций для определения свойств
- Полиморфизм — придание объектам разных типов одного интерфейса
- Композиция — встраивание свойств других объектов
- Наследование — передача свойств от родителя к потомку
Все эти механизмы работают вместе для создания гибких, масштабируемых и поддерживаемых приложений.