Mi pregunta está relacionada con enum s y switch expressions .
Tengo dificultades al intentar llamar al método usando getSeason(Months.OCTOBER) .
¿Cómo puedo llamar a este método en el método principal para imprimir “SPRING” ? No creo que el problema esté en el método Season, sino en el método main() .
Código:
public class Seasons { private static Seasons season; enum Seasons {SPRING, SUMMER, WINTER, AUTUMN}; enum Months { JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER}; public static Seasons getSeason(Months month) { Seasons season = null; switch (month) { case SEPTEMBER: case OCTOBER: case NOVEMBER: season = Seasons.SPRING; break; case DECEMBER: case JANUARY: case FEBRUARY: season = Seasons.WINTER; break; case JUNE: case JULY: case AUGUST: season = Seasons.SUMMER; break; case MARCH: case APRIL: case MAY: season = Seasons.AUTUMN; break; } return season; } public static void main(String[] args) { getSeason(Months.OCTOBER); //How can I print “SPRING” ? } }La respuesta de Alexander Ivanchenko es correcta. Agregaré un poco sobre nombres y algunos consejos.
Ya tenemos la enumeración java.time.Month . No hay necesidad de reinventar.
En general, una enumeración debe nombrarse en singular. Por ejemplo, java.time.Month y java.time.DayOfWeek . Entonces, Season en lugar de Seasons .
Las clases java.time ( JSR 310 ) establecieron algunas convenciones de nomenclatura que han demostrado ser sensatas y prácticas. Para pasar de lo más específico a lo más general, lo que significa que estamos perdiendo información, use from . Por ejemplo, java.time.YearMonth ofrece un método de fábrica estático from para producir un valor de año-mes a partir de un objeto de fecha, etc. Por lo tanto, Season#from( java.time.Month ) .
Y considere agregar un método para producir un nombre para mostrar, en lugar del nombre en mayúsculas del objeto de enumeración. Para un pequeño proyecto específico, codifique el resultado de dicho método, para un lenguaje específico. Si reutiliza esta clase, considere agregar localización a través de un argumento Locale pasado como se ve en las clases java.time . Por ejemplo, java.time.Month#getDisplayName( TextStyle , Locale ) .
enum Season { SPRING ( "Spring" ), SUMMER ( "Summer" ), WINTER ( "Winter" ), AUTUMN ( "Autumn" ); private String displayName ; Season ( String displayName ) { this.displayName = displayName ; } public String getDisplayName() { return this.displayName ; } public Season from( java.time.Month month ) { Objects.requireNonNull( month ) ; return switch ( month ) { case SEPTEMBER, OCTOBER, NOVEMBER -> Season.SPRING; case DECEMBER, JANUARY, FEBRUARY -> Season.WINTER; case JUNE, JULY, AUGUST -> Season.SUMMER; case MARCH, APRIL, MAY -> Season.AUTUMN; }; } }Uso:
System.out.println( Season.from( Month.JANUARY ) ) ; System.out.println( Season.from( Month.JANUARY ).getDisplayName() ) ;INVIERNO
Invierno
Por cierto, un consejo: ahora se puede definir una enumeración localmente, en Java 16 y versiones posteriores. Esto vino del trabajo en registros .
El método getSeason() hace su trabajo correctamente, la razón por la que no ve nada en la consola es que se ignora el resultado de la llamada al método.
Simplemente haz esto:
System.out.println(getSeason(Months.OCTOBER)); Por cierto, si está utilizando Java 14 + , su método getSeason() podría implementarse de manera más concisa.
public static Seasons getSeason(Months month) { return switch (month) { case SEPTEMBER, OCTOBER, NOVEMBER -> Seasons.SPRING; case DECEMBER, JANUARY, FEBRUARY -> Seasons.WINTER; case JUNE, JULY, AUGUST -> Seasons.SUMMER; case MARCH, APRIL, MAY -> Seasons.AUTUMN; }; }Este...
public class Seasons { enum Seasons {SPRING, SUMMER, WINTER, AUTUMN}; me está dando un sinfín de problemas, al compilador no parece gustarle el hecho de que hayas vuelto a declarar Seasons
También parece estar perdiendo la oportunidad de encapsular algunas de las funciones, por ejemplo, ¿no sería más fácil si pudiera preguntar directamente al MONTH qué estación representa?
Entonces, comencé cambiando el nombre de sus enum para que sean plurales y luego agregué compatibilidad con la enum Month para obtener la Season actual.
public class Seasons { enum Season { SPRING, SUMMER, WINTER, AUTUMN }; enum Month { JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER; public Season getSeason() { switch (this) { case SEPTEMBER: case OCTOBER: case NOVEMBER: return Season.SPRING; case DECEMBER: case JANUARY: case FEBRUARY: return Season.WINTER; case JUNE: case JULY: case AUGUST: return Season.SUMMER; case MARCH: case APRIL: case MAY: return Season.AUTUMN; } return null; } }; public static void main(String[] args) { System.out.println(Month.OCTOBER.getSeason()); } }