Menu
Coddy logo textTech

Методы геттеры и сеттеры

Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 11 из 87.

Геттеры и сеттеры — это методы, которые обеспечивают контролируемый доступ к приватным полям. Геттер извлекает значение поля, в то время как сеттер изменяет его.

Соглашение об именовании следует стандартному шаблону: префикс get или set, за которым следует имя поля с заглавной первой буквой.

public class Product {
    private String name;
    private double price;
    
    // Геттер для name
    public String getName() {
        return name;
    }
    
    // Сеттер для name
    public void setName(String name) {
        this.name = name;
    }
    
    // Геттер для price
    public double getPrice() {
        return price;
    }
    
    // Сеттер с валидацией
    public void setPrice(double price) {
        if (price >= 0) {
            this.price = price;
        }
    }
}

Настоящая сила сеттеров заключается в возможности добавления логики валидации. В примере выше setPrice принимает только неотрицательные значения, защищая объект от некорректных данных.

Для полей boolean геттеры обычно используют префикс is вместо get:

private boolean active;

public boolean isActive() {
    return active;
}

Вы также можете создавать поля только для чтения, предоставляя только геттер, или поля только для записи, предоставляя только сеттер. Это дает вам тонкий контроль над тем, как внешний код взаимодействует с данными вашего объекта.

challenge icon

Задание

Легко

Давайте создадим конвертер Temperature, который демонстрирует возможности геттеров и сеттеров с логикой валидации.

Вы создадите два файла для организации вашего кода:

  • Temperature.java: Определите класс Temperature, который хранит значение температуры в градусах Цельсия. Класс должен иметь:
    • Приватное поле celsius (double)
    • Приватное поле valid (boolean), которое отслеживает, является ли температура физически возможной
    • Геттер getCelsius(), который возвращает значение celsius
    • Сеттер setCelsius(), который принимает только значения, равные или превышающие абсолютный ноль (-273.15). Если значение валидно, установите valid в true; в противном случае не изменяйте celsius и установите valid в false
    • Геттер isValid() для логического поля (помните: геттеры для boolean используют префикс is)
    • Геттер getFahrenheit(), который конвертирует и возвращает температуру в Фаренгейтах по формуле: (celsius * 9/5) + 32
  • Main.java: Создайте объект Temperature, считайте значение celsius из входных данных, используйте сеттер для его установки, затем выведите, является ли температура валидной, и её эквивалент в Фаренгейтах. Сформируйте вывод в две строки:
    • Valid: true или Valid: false
    • Fahrenheit: X.X (с одним десятичным знаком)

Вы получите одно входное значение: число типа double, представляющее температуру в градусах Цельсия.

Для форматирования вывода Фаренгейтов до одного десятичного знака вы можете использовать String.format("%.1f", value).

Шпаргалка

Геттеры и сеттеры — это методы, которые обеспечивают контролируемый доступ к приватным полям. Геттер извлекает значение поля, а сеттер изменяет его.

Соглашение об именовании следует стандартному шаблону: префикс get или set, за которым следует имя поля с заглавной первой буквой.

public class Product {
    private String name;
    private double price;
    
    // Геттер для name
    public String getName() {
        return name;
    }
    
    // Сеттер для name
    public void setName(String name) {
        this.name = name;
    }
    
    // Геттер для price
    public double getPrice() {
        return price;
    }
    
    // Сеттер с валидацией
    public void setPrice(double price) {
        if (price >= 0) {
            this.price = price;
        }
    }
}

Сеттеры могут включать логику валидации для защиты объектов от некорректных данных. В примере выше setPrice принимает только неотрицательные значения.

Для полей типа boolean геттеры используют префикс is вместо get:

private boolean active;

public boolean isActive() {
    return active;
}

Вы можете создавать поля только для чтения, предоставляя только геттер, или поля только для записи, предоставляя только сеттер.

Попробуйте сами

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double celsiusInput = scanner.nextDouble();
        
        // TODO: Создайте объект Temperature
        
        // TODO: Используйте сеттер, чтобы установить значение celsius
        
        // TODO: Выведите, является ли температура допустимой (формат: "Valid: true" или "Valid: false")
        
        // TODO: Выведите эквивалент в Фаренгейтах (формат: "Fahrenheit: X.X")
        // Hint: Используйте String.format("%.1f", value) для одного знака после запятой
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование