Encapsulamiento de estado
Getters, setters y el método main
Getters y setters
Los getters y setters son el mecanismo convencional para exponer y modificar el estado de un objeto. Su valor no está en el acceso en sí, sino en que permiten añadir validación, notificaciones o lógica derivada sin cambiar la API. Un setter sin validación tiene poco valor — si no hay lógica, considera si el campo debería ser final.
public class Producto {
private String nombre;
private double precio;
private int stock;
public Producto(String nombre, double precio) {
this.nombre = nombre;
setPrecio(precio); // reutilizar la validación del setter
this.stock = 0;
}
// Getter: acceso de solo lectura
public String getNombre() { return nombre; }
// Getter + setter con validación
public double getPrecio() { return precio; }
public void setPrecio(double precio) {
if (precio < 0) throw new IllegalArgumentException("Precio negativo");
this.precio = precio;
}
// Solo getter: stock no se puede establecer directamente
public int getStock() { return stock; }
// Comportamiento explícito en lugar de setter directo
public void agregarStock(int cantidad) {
if (cantidad <= 0) throw new IllegalArgumentException();
stock += cantidad;
}
} El método main
public static void main(String[] args) es el punto de entrada que la JVM busca al arrancar. Debe
ser exactamente esa firma. static porque la JVM lo invoca sin crear un objeto. args recibe los argumentos de la línea de comandos.
// El método main: punto de entrada de la JVM
// Firma exacta requerida: public static void main(String[] args)
public class AplicacionCLI {
public static void main(String[] args) {
// args: argumentos pasados por línea de comandos
// java AplicacionCLI arg1 arg2 arg3
if (args.length == 0) {
System.out.println("Uso: java AplicacionCLI <nombre>");
return;
}
String nombre = args[0];
System.out.println("Hola, " + nombre);
}
} Convenciones de nombres
Java tiene convenciones de nombres ampliamente adoptadas. Los IDEs y herramientas como Lombok las conocen y las usan para generar código. Respetarlas hace que el código sea predecible para cualquier desarrollador Java.
// Convenciones de nombres en Java (se siguen universalmente):
// Clases y interfaces: PascalCase
public class UsuarioRepositorio { }
public interface ServicioCorreo { }
// Métodos y variables: camelCase
String nombreCompleto = "Ana García";
int calcularEdad(Date fechaNacimiento) { return 0; }
// Constantes: UPPER_SNAKE_CASE
public static final int MAX_INTENTOS = 3;
public static final String URL_BASE = "https://api.ejemplo.com";
// Paquetes: lowercase con puntos
package com.empresa.proyecto.modulo;
// Prefijos de getters/setters/isXxx para boolean
boolean esActivo() { return activo; } // boolean: is/has/can
String getNombre() { return nombre; } // otros tipos: get
void setNombre(String n) { nombre = n; }