Variables y Métodos Estáticos en Java: Uso y Beneficios
Resumen
¿Cómo podemos trabajar con métodos y variables estáticas en Java?
Comenzar con las bases sólidas en la programación es crucial para dominar Java. En nuestra clase anterior, exploramos cómo declarar métodos y variables estáticas, lo que nos permite acceder a ellos desde cualquier parte del código sin necesidad de instanciar un objeto específico. Este enfoque es eficiente y reduce la complejidad de nuestro programa.
A continuación, revisaremos cómo aplicar estos conceptos en un menú interactivo en Java, el cual permite al usuario elegir opciones y mostrar información con el uso de variables y métodos estáticos.
¿Cómo se estructura un menú en Java?
Un menú en programación es una interfaz que permite al usuario interactuar y elegir opciones para ejecutar comandos específicos. En este caso, el menú que creamos muestra una lista de opciones, donde el usuario puede seleccionar números para recibir una respuesta correspondiente, como mostrar una lista de meses.
Ejemplo de menú interactivo
publicclassMenu{publicstaticvoidmain(String[] args){Scanner scanner =newScanner(System.in);int option;do{System.out.println("Selecciona la opción deseada:");System.out.println("1. Mostrar meses");System.out.println("0. Salir"); option = scanner.nextInt();switch(option){case1:mostrarMeses();break;case0:System.out.println("Saliendo...");break;default:System.out.println("Opción inválida.");}}while(option !=0);}publicstaticvoidmostrarMeses(){for(int i =0; i <3; i++){System.out.println((i +1)+". Mes "+(i +1));}}}
En este código, implementamos un menú utilizando un bucle do-while para mantenerlo activo hasta que el usuario elija salir. Esto permite interactuar de manera dinámica con las opciones presentadas.
¿Por qué utilizar variables estáticas y constantes?
Las variables estáticas y las constantes son herramientas valiosas en la programación, ya que ofrecen flexibilidad y control. Una variable estática nos permite compartir datos a lo largo de todo el programa, siendo accesibles desde cualquier clase, mientras que las constantes nos garantizan que ciertos valores no cambiarán.
Definición de constantes en Java
Para declarar una constante, utilizamos la palabra clave final, lo cual asegura que una variable no podrá ser reasignada una vez inicializada. Es común en Java que las constantes también se declaren como estáticas mediante static final, aunque no es una regla obligatoria.
En este ejemplo, la variable MONTHS es una constante, significando que contiene un arreglo de cadenas cuyos valores no cambiarán. Esto es particularmente útil para valores fijos que se utilizan repetidamente.
¿Cuándo usar la palabra clave final?
La palabra final es especialmente útil en situaciones donde garantizar la inmutabilidad es necesario. Es preferido en casos donde:
Seguridad: Evita que los valores críticos se cambien por accidente.
Consistencia: Proporciona un único punto de verdad para valores invariables.
Optimización: Permite al compilador hacer optimizaciones, dado que el valor no cambiará.
En la práctica, decidir cuándo usar static y final depende de las necesidades específicas del programa. Habiendo dominado estos conceptos, se estará mejor preparado para escribir código más eficiente y organizado. ¡Continúa explorando y aprendiendo, y verás cómo tus habilidades en Java se consolidan!
Hola @ann, hace un tiempo, un desarrollador con mucho conocimiento me indicaba que referenciar imports con la expresión de .* era una mala práctica, ya que se ocupaba mucho mas espacio en memoria y demoraba mas la búsqueda del método que queríamos utilizar en momento de ejecución. Por ende, siempre tratar de importar el método especifico. Esto aún mas cuando la clase que queremos importar contiene muchos métodos.
Que tan cierto es?
Hola, esto es cierto. Para programas ya en producción debes realizar el import especifico que necesitas, si utilizas * lo que sucede es que Java va a importar todo sobre el módulo que le indiques y esto va a afectar en la memoria.
Hola, el uso de ".*", en el caso de los IDEs, puede hacer que se demore en el proceso de indexación y busqueda, principalmente al momento de ofrecerte funcionalidades como el autocompletamiento (dependerá de las características de la pc).
A nivel del compilador realmente no afecta, ya que el compilador de Java es capaz de solo emplear lo que va a necesitar.
Te adjunto un fragmento del libro "++OCA - Oracle Certified Associate Java SE 8 Programmer I++", donde habla sobre el uso de los "wildcards(*)".
"You might think that including so many classes slows down your program, but it doesn’t. The compiler figures out what’s actually needed. Which approach you choose is personal preference."
He visto que muchos consideran final == const y esto no es verdad. Creo que es porque Ann debería de usar const según el ejemplo que mostró en la clase en lugar de final. Dejenme explicar.
Aunque se puede usar indistintamente en algunos casos, hay que tener en cuenta las diferencias.
¿Qué es final?
final quiere decir que solamente podemos hacer una sola asignación. Esto es: Lo podemos definir sin asignar un valor, pero después en algún momento se tiene que inicializar y ese valor no podrá cambiar.
¿Qué es const?
const es un poco más complejo y tiene algunas propiedades interesantes. Cuando se usa const quiere decir que el valor el cual tiene asignado se puede determinar completamente en la compilación. Por ejemplo: un valor de const puede ser: “1+2” pues se calcula al momento de compilar, y un valor invalido seria “new DateTime.now()” porque este último se obtiene en runtime(Cuando ejecutas el programa).
Diferencias:
-Si usas const , lo tienes que declarar como “static const” en lugar de solamente “const”.
-Cuando queremos una colección completamente inmutable, utilizamos const, pues todo lo que esté dentro de esa colección también será inmutable. En cambio si utilizamos final, todo lo que esté dentro no será final.
-final debería de usarse en lugar de const cuando no conocemos el valor al tiempo de compilación y éste será calculado u obtenido en runtime.
Como los datos de los nombres de los meses no se obtiene en run-time sino en compile-time es mejor utilizar const en este caso.
Incluso conceptualmente es mejor, pues los meses nunca cambian de nombre, siempre son constantes(const).
Muy buena explicación, ¿tendrás las referencias de donde lo sacaste?, me interesa leer un poco más sobre el run-time y el compiler-time
En el lenguaje de Java no existe la palabra reservada const.
public final staticString[]MONTHS={"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};
En la explicación de final, se cambió months a la convención de constantes (a mayuscula) pero no se colocó en ningún momento la palabra reservada final, esto es correcto?
Buena observación, efectivamente sin el final no es una constante, solo se le cambio el nombre al array con letras mayúsculas, esto es una convención por lo tanto para el programa eso no es una constante.
Ahunque es sintácticamente correcto, no lo es semánticamente, es especial por que se se está usando como ejemplo de uso de final. Creo que es un error involuntario por parte de la profe, por favor no la crucifiquen :-)
El uso de static es para cuando requiero que una variable tenga un scope global. A menudo se utiliza como si fuera una constante pero no es una regla.
Tks
Según lo que entendí
final == CONST
claro es una constante que su valor no va poder ser reasignado.
Prácticamente es lo mismo, pero cada uno tiene su utilidad especifica.
Por cierto con alt + enter pueden hacer un import static de un metodo
Tks
En serio, son clases muy buenas. Me sentí todo un hackerrrssss jakjajaja al darme cuenta que estaba recorriendo mal el arreglo de meses, antes que lo ejecutara. Yo lo resolví así. :D
case1:System.out.println("::Book an appointment");for(int i =0; i<3; i++){System.out.println(i+1+". "+MONTS[i]);}
for (int i = 1; i < 4; i++) {
System.out.println(i + ". " + MONTHS[i-1]);
}
Buena clase, mi unica queja es de que estamos nombrando variables en ingles y ahora con los meses los ponemos en español. O todo español o todo ingles digo yo.
¿Qué diferencia hay entre inicializar un array con new <tipo> [<cantidad>], y con {}, es decir, sin poner implicitamente la cantidad de datos que tendrá el array?
Básicamente que al usar [] sólo indicas el tamaño del array, mientras que con {} das un valor inicial a cada elemento del array.
Te doy un ejemplo con los días de la semana.
String[] diasSemana =newString[7];
Estás indicando que diasSemana es un arreglo de tipo String de 7 elementos, pero no le estás dando un valor inicial, por lo luego tendrías que hacerlo de la siguiente forma:
diasSemana[0]="Lunes";diasSemana[1]="Martes";//Y así hasta terminar todos los días
Mientras, al usar los {} puedes dar el valor inicial de cada elemento y el tamaño lo define automáticamente.
Curso de introducción a JAVA SE, de Desarrollo Backend con Java.
Para declarar una constante en Java podemos utilizar la palabra reservada final.
Forma correcta de realizar muestra de los meses, esto se debe a que la memoria de los arrays empuezan desde 0 y no desde 1.
System.out.println("::Book an appointment");for(int i =0; i <3; i++){System.out.println(MONTHS[i]);}
me pueden pasar el codigo del menu gracias
package mymedicalappointments.ui;import java.util.Scanner;publicclassUIMenu{publicstaticvoidshowMenu(){System.out.println("Welcome to My Appointments");System.out.println("Selecciona la opción deseada"); int response =0;do{System.out.println("1. Doctor");System.out.println("2. Patient");System.out.println("0. Salir");Scanner sc =newScanner(System.in); response =Integer.valueOf(sc.nextLine());switch(response){case1:System.out.println("Doctor");break;case2: response =0;showPatientMenu();break;case0:System.out.println("Thank you for you visit");break;default:System.out.println("Please select a correct answer");}}while(response !=0);}publicstaticvoidshowPatientMenu(){ int response =0;do{System.out.println("\n\n");System.out.println("Patient");System.out.println("1. Book an appointment");System.out.println("2. My appointments");System.out.println("0. Return");Scanner sc =newScanner(System.in); response =Integer.valueOf(sc.nextLine());switch(response){case1:System.out.println("::Book an appointment");break;case2:System.out.println("::My appointments");break;case0:showMenu();break;}}while(response !=0);}}
En el codigo que paso willianromero acordate de separar el "case" del numero, porque si no te da error. En la imagen esta "case1" (por ejemplo) y tiene que estar escrito "case 1".
Final es solamente para constantes, ya que su valor ya no se puede cambiar
Conforme se vaya avanzando el curso, se verá que final tiene otras funciones según donde se declare.
Pero en el caso de que se declare final en una Array no quiere decir que no se pueda modificar sus elementos, simplemente evita que se cree una nueva instancia, y de esa manera tendría una longitud fija.
Hola estimados, me confundo un poco con el ambito de las variables, si se dice que es global haciendola static, para que necesitamos anteponer public.???
Hola, cuando utilizamos "static" estamos definiendo como global (para toda la clase, no para un objeto en específico) el scope de la variable, es decir, su alcance o ciclo de vida.
En cambio, los modificadores "public" y derivados (protected, default y private), hacen referencia a desde dónde podemos tener acceso a la variable.
Espero se haya entendido.
Saludos.
Hay que entender varios conceptos:
Modo de acceso: private, public, protected, default
Abstracción o independencia: static
Mutabilidad: final
En contexto, "static" la ocupamos para decir sí una clase, y sus derivadas, mantendrá una referencia. Si no la determinas así, sus instancias u objetos no compartirán como referencia este o varios atributos.
Te invito a probar el siguiente código y compartir tus conclusiones:
publicclasscarro(){privatestatic int numUso =0;privateString modelo ="Tida";carro(){ numUso +=1;}//Get y Set respectivos de String// Solamente get de numUso}
Notarás que todas sus instancias tendrán algo más en común que solamente la clase donde se instancian.
Nota: Tiene rato que no tomo a Java, pero entenderás el código. 😅