Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso de Java SE Orientado a Objetos

Curso de Java SE Orientado a Objetos

Anahí Salgado Díaz de la Vega

Anahí Salgado Díaz de la Vega

Final: Variables Constantes

9/38
Recursos

Aportes 47

Preguntas 9

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

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?

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).

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?

public final static String[] MONTHS = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"};

Según lo que entendí
final == CONST

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.

Por cierto con alt + enter pueden hacer un import static de un metodo

🔆 Final nos permite indicar que una variable sea constante.

me pueden pasar el codigo del menu gracias

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í. 😄

case 1:
                    System.out.println("::Book an appointment");
                    for (int i = 0; i<3; i++) {
                    	System.out.println(i+1 +". "+MONTS[i]);
                    }

Final es solamente para constantes, ya que su valor ya no se puede cambiar

Final: Variable constantes

Final hace a una variable constante, lo que significa que una variable siempre será constante y se escriben en mayúsculas. Cuando se utiliza final la variable nunca podrá ser reasignada.

VIVA LA TECNOLOGIA!


No se si me equivoco, pero creo que nunca nos mencionaron de esa manera de inicializar arrays utilizando {} como se utilizó en el array months, de esta manera no tenemos que inicializar los valores después.

Hola compañeros, les comparto mi codio de los menus con las JOptionPane
si tienen alguna alguna pregunta no duden en comentarla

import javax.swing.JOptionPane;

public class UIMenu {

    public static final String[] MONTHS = { "enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"};

    public static void showMenu(){
       // System.out.println("Welcome to My Appointments");
        //System.out.println("Selecciona la opción deseada");
        String [] options = {"Doctor", "Patient", "Exit"};
        int response;
        do{
            response = JOptionPane.showOptionDialog(null, "Seleccione la opción deseada", "Welcome to my Appointments",0, JOptionPane.QUESTION_MESSAGE, null, options, "Doctor");
           /* System.out.println("1. Doctor");
            System.out.println("2. Patient");
            System.out.println("3. Salir");
            Scanner sc = new Scanner(System.in);
            response = Integer.valueOf(sc.nextLine());*/
            switch (response){
                case 0:
                    System.out.println("doctor");
                    break;
                case 1:
                    response = 2;
                    showPatientMenu();
                    break;
                case 2:
                    System.out.println("Thank you for you visit");
                    break;
                default:
                    System.out.println("please select a correct answer");
            }
        }while(response != 2);
    }

    public static void  showPatientMenu() {
        int response = 0;
        String [] options = {"Book an appointment", "My Appointments", "Return"};

        do {
            response = JOptionPane.showOptionDialog(null, "Seleccione la opción deseada", "Patient", 0, JOptionPane.QUESTION_MESSAGE, null, options, "Doctor");
            /*System.out.println("\n\n");
            System.out.println("Patient");
            System.out.println("1. Book an appointment");
            System.out.println("2. My appointmets");
            System.out.println("0. return");
            Scanner sc = new Scanner(System.in);
            response = Integer.valueOf(sc.nextLine());*/
            switch (response) {
                case 0:
                    System.out.println(":: Book an appointment");
                    for (int i = 0; i < 3; i++) {
                        System.out.println(i+1 + ".\t" +MONTHS[i]);
                    }
                    break;
                case 1:
                    System.out.println(":: My appointmet");
                    break;
                case 2:
                    showMenu();
                    break;
            }
        } while (response != 2);
    }
}

veo que Java tambien tiene una palabra reserva llamada “const” , que diferencias hay con “final” ?

Interesado por aprender el uso del For each 😄

Al archivo Doctor.java le falta el método showId.
Aquí está:

public void showId()
    {
        System.out.println("ID Doctor: " + id);
    }

En el for del case se debe usar i=0 ,i<3 . En java los arreglos arrancan en 0 es decir MONTHS [0] = “Enero”

Cuando una variable se declara con la palabra clave final, su valor no se puede modificar, se convierte en una constante. Esto también significa que debe inicializar una variable final.

Final: Variables constantes

En está clase vamos a agregar un nuevo menú para la parte de agendar una cita como paciente.

En la sección de agendar vamos a mostrar 3 meses, previamente se declara un arreglo con los meses. El arreglo es estático para poder usarlo en toda la clase sin problema.

Luego, usando un for, vamos a mostrar los primeros tres meses.


<h4>Constantes</h4>

Cuando necesitas una “variable” para un dato que no va a cambiar (como los meses del año). Para declarar estas variables constantes se usa la palabra final, esto hará que su valor no pueda ser reasignado. Es una buena práctica llamar a estas constantes en mayúsculas.

Que buen punto menciona al saber que las constantes normalmente también son estáticas.

Variables constante sirven mucho al parecer

Super!! Me va encantando el curso!!

Hay una opción en el editor para que el código llegue solo hasta el margen de la ventana y luego salte a otra linea??

Con las constantes podemos evitar muchos problemas en tiempo de ejecución. Ya que por error podemos cambiar alguno de los datos y luego el programa nos da problemas, que cuando son de este tipo son muy dificles de conseguir.

Interesante!

Cada clase vamos aprendiendo el significado y funcionalidad de las palabras reservada, fue una buena clase sobre las variables constantes y como siguiendo las buenas practicas podemos hacer que se identifiquen rápidamente al colocarlas en mayúsculas.
 
Por cierto, a mí me funciono el siguiente código para ajustar la presentación de los meses:

	System.out.println("::Book an appointment");
	for (int i = 0; i < 3; i++) {
		System.out.println((i+1) + ". " + MONTHS[i]);
	}
	break;

Que interesante!

vamos bien gracias 😃

Hasta ahora todo bien 😃

Genial, todo funcionando y entendido hasta el momento. Sigamos.

Muy claro el uso de static y final , con este ejemplo.

keyword = palabrota

Me gusta 😀

Y entonces porque no agregó “final” en el arreglo “MONTHS”???

Yo sigo sin entender cuando usar un static y no una funcion como tal, seria como si static fuera para declarar variables o funciones de manera global?

final = CONST

Para la solución a este pequeño inconveniente, se tendrá en cuenta la modificación al for:

System.out.println("Book an appointment");
for (int i = 0; i <=3 ; i++)
{
     System.out.println(i+1+". "+MONTHS[i]);
}
break;

Clase 9: Final - Variables Constantes

Para los que les apetezca tomar la clase en Eclipse iré subiendo mi código; hay pequeñas diferencias con Intellij, por no decir ninguna, pero con Eclipse se puede trabajar igual de bien. NOTA: Solo subiré la jerarquía y lo que haya sido modificado, tendrán los archivos no modificados en las clases anteriores.

Jerarquía del proyecto


Archivo: UIMenu.java; Clase: showPatientMenu()

public static void showPatientMenu() {
		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 = new Scanner(System.in);
			response = Integer.valueOf(sc.nextLine());

			switch (response) {
			case 1:
				System.out.println("::Book an appointment");
				for (int i = 0; i < 3; i++) {
					System.out.println(i + 1 + ". " + months[i]);
				}
				break;
			case 2:
				System.out.println("::My appointments");
				break;
			case 0:
				showMenu();
				break;
			}
		} while (response != 0);
	}

excelente explicación, muy útil

package ui;

import java.util.Scanner;

public class UIMenu {
    public static String[] MONTHS = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "DIciembre"};

    /**
     * Descripción: Menu Princial
     * */
    public static void showMenu(){
        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 = new Scanner(System.in);
            response = Integer.valueOf(sc.nextLine());

            switch (response){
                case 1:
                    System.out.println("Doctor");
                    break;
                case 2:
                    response = 0;
                    showPatientMenu();

                    break;
                case 0:
                    System.out.println("Thank you for you visit");
                    break;
                default:
                    System.out.println("Please select a correct answer");
            }
        }while (response != 0);
    }
    /**
     * Descripción: Menu del paciente
     * */
    static void showPatientMenu() {
        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 = new Scanner(System.in);
            response = Integer.valueOf(sc.nextLine());

            switch (response) {
                case 1:
                    System.out.println("::Book an appointment");
                    for (int i = 1; i < 4; i++) {
                        System.out.println(i + ". " + MONTHS[i]);
                    }
                    break;
                case 2:
                    System.out.println("::My appointments");
                    break;
                case 0:
                    showMenu();
                    break;
            }
        } while (response != 0);
    }
}```

Una constante se diferencia porque se escribe todo en mayúsculas.

Hola
Revisando el código de la clase veo que es incorrecto inicializar el valor de i en 1, ya que los arreglos se recorren desde la posición 0, además que no veo muy correcto agregar más código dentro de un case.
Por este motivo agregué las siguientes mejoras al código. Son muy sencillas, pero no dejan de ser necesarias:

public class UIMenu {

    public static final String[] MONTHS = {"January", "February", "March", "April", "May", "June", "July", "August", "September",
    "october", "November", "December"};

    public static void showMenu(){
        System.out.println("Welcome to my Appointments");
        System.out.println("Please type the number according to your user category");

        int response = 0;

        do{
            System.out.println("1. Doctor");
            System.out.println("2. Patient");
            System.out.println("0. Exit");

            Scanner typed = new Scanner(System.in);
            try{
                response = Integer.valueOf(typed.nextLine());
            }catch (NumberFormatException e){
                response = 9;
            }

            System.out.println(response);
            switch (response){

                case 1:
                    System.out.println("Welcome Doctor!!");
                    response = 0;
                    break;

                case 2:
                    System.out.println(" ");
                    System.out.println(":: Welcome Patient!!");
                    showPatientMenu();
                    break;

                case 9:
                    System.out.println("\nHola \nThe value received is not admitted, please try again.\n");

                    break;

                case 0:
                    System.out.println("\nIt was nice to assist you. See you soon!");
                    break;


                default:
                    System.out.println("\n Hola! \nYou typed an incorrect number, please type the number according" +
                            "to your user category\n");

            }

        }while(response != 0);
    }

    static void showPatientMenu(){
        int response = 0;

        do{
            System.out.println("Please choose the action you would like to do");
            System.out.println(" ");
            System.out.println("1. Book an appointment");
            System.out.println("2. My appointments");
            System.out.println("0. Return to the main menu");

            Scanner typed = new Scanner(System.in);
            try{
                response = Integer.valueOf(typed.nextLine());
            }catch (NumberFormatException e){
                response = 9;
            }

            switch (response){
                case 1:
                    System.out.println(" ");
                    System.out.println(":: Welcome to the booking appointment screen");
                    displayingMonths();
                    break;

                case 2:
                    System.out.println(" ");
                    System.out.println(":: Welcome to your appointments dashboard");
                    break;

                    case 9:
                    System.out.println("\nHola \nThe value received is not admitted, please try again.\n ");
                    break;

                case 0:
                    showMenu();
                    break;

                default:
                    System.out.println("\nHola! \nYou typed an incorrect number, please type the number according" +
                            "to the available options from the menu.\n");
            }

        }while (response != 0);
    }


    static void displayingMonths(){
        int response = 0;
        do {
            System.out.println("Please type the month number when you would like to set your appointment");
            System.out.println(" ");
            for (int i = 0; i < 3; i++) {
                System.out.println((1+i) +". " + MONTHS[i]);
            }
            System.out.println("0. Return to the main menu");

            Scanner typed = new Scanner(System.in);
            try {
                response = Integer.valueOf(typed.nextLine());
            } catch (NumberFormatException e) {
                response = 9;
            }

            switch (response){
                case 1:
                    System.out.println(":: Month Selected: " + MONTHS[0]+".\n");
                    break;

                case 2:
                    System.out.println(":: Month Selected: " + MONTHS[1]+".\n");
                    break;

                case 3:
                    System.out.println(":: Month Selected: " + MONTHS[2]+".\n");
                    break;

                case 9:
                    System.out.println("\nHola \nThe value received is not admitted, please try again.\n");
                    break;

                case 0:
                    showPatientMenu();
                    break;

                default:
                    System.out.println("\nHola! \nYou typed an incorrect number, please type the number according" +
                            "to the available options from the menu.\n");
            }

        }while(response != 0);
    }

}

Saludos