Métodos Getter y Setter
Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy — lección 11 de 87.
Los getters y setters son métodos que proporcionan un acceso controlado a los campos privados. Un getter recupera el valor de un campo, mientras que un setter lo modifica.
La convención de nomenclatura sigue un patrón estándar: el prefijo get o set seguido por el nombre del campo con su primera letra en mayúscula.
public class Product {
private String name;
private double price;
// Getter para name
public String getName() {
return name;
}
// Setter para name
public void setName(String name) {
this.name = name;
}
// Getter para price
public double getPrice() {
return price;
}
// Setter con validación
public void setPrice(double price) {
if (price >= 0) {
this.price = price;
}
}
}El verdadero poder de los setters es la capacidad de añadir lógica de validación. En el ejemplo anterior, setPrice solo acepta valores no negativos, protegiendo al objeto de datos no válidos.
Para los campos boolean, los getters suelen utilizar el prefijo is en lugar de get:
private boolean active;
public boolean isActive() {
return active;
}También puedes crear campos de solo lectura proporcionando solo un getter, o campos de solo escritura proporcionando solo un setter. Esto te brinda un control detallado sobre cómo el código externo interactúa con los datos de tu objeto.
Desafío
FácilVamos a construir un convertidor de Temperature que demuestre el poder de los getters y setters con lógica de validación.
Crearás dos archivos para organizar tu código:
Temperature.java: Define una clase Temperature que almacene un valor de temperatura en Celsius. La clase debe tener:- Un campo privado
celsius(double) - Un campo privado
valid(boolean) que rastree si la temperatura es físicamente posible - Un getter
getCelsius()que devuelva el valor de celsius - Un setter
setCelsius()que solo acepte valores iguales o superiores al cero absoluto (-273.15). Si el valor es válido, establecevalidcomo true; de lo contrario, no cambies celsius y establecevalidcomo false - Un getter
isValid()para el campo booleano (recuerda: los getters booleanos usan el prefijois) - Un getter
getFahrenheit()que convierta y devuelva la temperatura en Fahrenheit usando la fórmula:(celsius * 9/5) + 32
- Un campo privado
Main.java: Crea un objeto Temperature, lee un valor celsius como entrada, usa el setter para establecerlo, luego imprime si la temperatura es válida y su equivalente en Fahrenheit. Formatea tu salida en dos líneas:Valid: trueoValid: falseFahrenheit: X.X(mostrando un decimal)
Recibirás una entrada: un valor double que representa una temperatura en Celsius.
Para formatear la salida de Fahrenheit a un decimal, puedes usar String.format("%.1f", value).
Hoja de referencia
Los getters y setters son métodos que proporcionan acceso controlado a campos privados. Un getter recupera el valor de un campo, mientras que un setter lo modifica.
La convención de nomenclatura sigue un patrón estándar: el prefijo get o set seguido del nombre del campo con su primera letra en mayúscula.
public class Product {
private String name;
private double price;
// Getter para name
public String getName() {
return name;
}
// Setter para name
public void setName(String name) {
this.name = name;
}
// Getter para price
public double getPrice() {
return price;
}
// Setter con validación
public void setPrice(double price) {
if (price >= 0) {
this.price = price;
}
}
}Los setters pueden incluir lógica de validación para proteger los objetos de datos no válidos. En el ejemplo anterior, setPrice solo acepta valores no negativos.
Para los campos boolean, los getters utilizan el prefijo is en lugar de get:
private boolean active;
public boolean isActive() {
return active;
}Puedes crear campos de solo lectura proporcionando únicamente un getter, o campos de solo escritura proporcionando únicamente un setter.
Pruébalo tú mismo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double celsiusInput = scanner.nextDouble();
// TODO: Crear un objeto Temperature
// TODO: Usar el setter para establecer el valor en celsius
// TODO: Imprimir si la temperatura es válida (formato: "Valid: true" o "Valid: false")
// TODO: Imprimir el equivalente en Fahrenheit (formato: "Fahrenheit: X.X")
// Sugerencia: Usar String.format("%.1f", value) para un lugar decimal
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a la OOPClases vs. ObjetosLa palabra clave thisMétodosCampos (Atributos)Método constructorSobrecarga de constructoresResumen - Calculadora simple4Herencia
Herencia básica (extends)La palabra clave superSobrescritura de métodos (@Override)Encadenamiento de constructoresLa clase ObjectHerencia simple y multinivelPor qué no hay herencia múltiple de clasesResumen - Jerarquía de empleados7Métodos especiales y la clase Object
Método toString()equals() y hashCode()Método clone()compareTo() y ComparableInterfaz ComparatorResumen - Ordenamiento personalizado2Modificadores de acceso y encapsulamiento
Visión general de los niveles de accesoMétodos Getter y SetterOcultamiento de informaciónLa palabra clave finalResumen - Gestor de cuentas bancarias5Polimorfismo
Fundamentos de sobrecarga de métodosSobrescritura de métodos (tiempo de ejecución)Upcasting y DowncastingEl operador instanceofClases y métodos abstractosResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaAgregación vs. ComposiciónClases internas, anidadas y anónimasEnums y métodos de EnumRecords (Java 16+)Clases selladas (Java 17+)11Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón BuilderPatrón ObserverPatrón Strategy3Propiedades de clase y miembros estáticos
Variables de instancia vs. estáticasMétodos estáticosBloques estáticosConstantes (static final)Repaso - Contador y utilidad6Interfaces y Clases Abstractas
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesMétodos Default y Static en InterfacesClases Abstractas vs InterfacesInterfaces FuncionalesResumen - Sistema de Pagos9Genéricos
Introducción a los genéricosClases genéricasMétodos genéricosParámetros de tipo delimitadosComodines (?, extends, super)Resumen - Contenedor genérico12Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Iterator