Constantes (static final)
Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy — lección 18 de 87.
Combinar static y final crea una constante - un valor que pertenece a la clase y nunca puede cambiar. Esta es la forma estándar de definir constantes en Java.
public class GameSettings {
public static final int MAX_PLAYERS = 4;
public static final double GRAVITY = 9.81;
public static final String GAME_TITLE = "Space Adventure";
}Por convención, los nombres de las constantes utilizan UPPER_SNAKE_CASE para distinguirlos de las variables regulares. Dado que son tanto static como final, se accede a ellos a través del nombre de la clase y se garantiza que sus valores nunca cambiarán:
System.out.println(GameSettings.MAX_PLAYERS); // 4
// GameSettings.MAX_PLAYERS = 8; // ¡Error! No se puede modificarLas constantes se declaran típicamente como public porque están destinadas a ser compartidas en toda la aplicación. Piense en valores como Math.PI: es una constante public static final que cualquier código puede usar.
¿Por qué usar constantes en lugar de valores codificados directamente? Si escribes 4 en todo tu código y luego necesitas cambiarlo a 6, tendrías que buscar y actualizar cada ocurrencia. Con una constante como MAX_PLAYERS, lo cambias en un solo lugar.
Las constantes también hacen que el código sea más legible - MAX_PLAYERS es más claro que un misterioso 4.
Desafío
FácilVamos a construir una utilidad MathConstants que almacene valores matemáticos importantes como constantes, junto con un CircleCalculator que utilice esas constantes para realizar cálculos.
Crearás dos archivos para organizar tu código:
MathConstants.java: Crea una clase que contenga constantes matemáticas utilizando campospublic static final:PIcon el valor3.14159E(número de Euler) con el valor2.71828GOLDEN_RATIOcon el valor1.61803
Main.java: Utiliza tus constantes para realizar cálculos de círculos. Recibirás un radio como entrada e imprimirás tres líneas:- El área del círculo:
Area: [value] - La circunferencia del círculo:
Circumference: [value] - El diámetro escalado por la proporción áurea:
Golden Diameter: [value]
- El área del círculo:
Para los cálculos:
- Area = PI * radius * radius
- Circumference = 2 * PI * radius
- Golden Diameter = 2 * radius * GOLDEN_RATIO
Recibirás una entrada: el radio (double).
Formatea todos los valores de salida a 2 decimales usando String.format("%.2f", value). Accede a tus constantes a través del nombre de la clase, como MathConstants.PI.
Hoja de referencia
Combinar static y final crea una constante: un valor que pertenece a la clase y que nunca puede cambiar:
public class GameSettings {
public static final int MAX_PLAYERS = 4;
public static final double GRAVITY = 9.81;
public static final String GAME_TITLE = "Space Adventure";
}Por convención, los nombres de las constantes utilizan UPPER_SNAKE_CASE. Acceda a las constantes a través del nombre de la clase:
System.out.println(GameSettings.MAX_PLAYERS); // 4
// GameSettings.MAX_PLAYERS = 8; // ¡Error! No se puede modificarLas constantes se declaran normalmente como public para ser compartidas en toda la aplicación. Hacen que el código sea más fácil de mantener y leer al reemplazar los valores codificados de forma rígida por nombres significativos.
Pruébalo tú mismo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double radius = scanner.nextDouble();
// TODO: Calcular el área usando MathConstants.PI
// Fórmula: PI * radio * radio
// TODO: Calcular la circunferencia usando MathConstants.PI
// Fórmula: 2 * PI * radio
// TODO: Calcular el diámetro de oro usando MathConstants.GOLDEN_RATIO
// Fórmula: 2 * radio * GOLDEN_RATIO
// TODO: Imprimir los resultados con formato de 2 decimales
// Usar String.format("%.2f", value) para el formato
// Formato de salida:
// Area: [value]
// Circumference: [value]
// Golden Diameter: [value]
}
}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