Algunas cosas a mencionar.
Los atributos, salvo que tengamos algún motivo especial, por regla general se declaran como
private private enumMes mes;
private int dia;
private int anio;
Los constructores, salvo que haya un motivo especial, los declararemos como
public public Fecha(enumMes mes){
dia = 0;
anio = 0;
mes = mes;
}
public Fecha(int dia, enumMes mes, int anio){
dia = dia;
mes = mes;
anio = anio;
}
Eso dos constructores, tienen un problema serio.
No estás usando la palabra reservada
thisSi no la usamos, el compilador no sabe distinguir cuando nos referimos al atributo de la clase o al objeto que recibe el constructor, cuando estos tienen el mismo nombre.
Por ejemplo, en este constructor, la linea que señalo en rojo:
public Fecha(enumMes mes){
dia = 0;
anio = 0;
mes = mes;
}
Tu ahí pretendes asignarle al atributo llamado mes, la referencia recibida por paréntesis, que también se llama mes.
Pero Java no sabe que tú quieres referirte al atributo y lo que hace es asignar a la referencia mes, a sí misma... lo cuál es absurdo.
O les das nombres distintos, para que Java sepa a quien te refieres
public Fecha(enumMes otroMes){
dia = 0;
anio = 0;
mes = otroMes;
}
O si no, usa la palabra reservada
this para indicar cuándo te refieres al atributo
public Fecha(enumMes mes){
dia = 0;
anio = 0;
this.mes = mes;//A "este mes", le asignamos el "otro mes"
}
El otro constructor, requiere la misma corrección, porque ahora mismo no está asignando nada a los atributos
public Fecha(int dia, enumMes mes, int anio){
this.dia = dia;
this.mes = mes;
this.anio = anio;
}
El método isSummer() está mal, por varios motivos.
Primero, porque da igual lo que se compute, solo hay un return que siempre retorna false
public boolean isSummer(){
String mes = null;
if ( mes == "Junio" || mes == "Julio" || mes == "Agosto" || mes == "Septimebre" ) {
boolean isSummer = true;
}
else {
boolean isSummer = false;
}
return false;
}
En cuanto a lo computa, nunca va a funcionar, porque no se está trabajando con el atributo mes de esta clase Fecha.
Se está trabajando con un String que tiene valor null
public boolean isSummer(){
String mes = null;
if ( mes == "Junio" || mes == "Julio" || mes == "Agosto" || mes == "Septimebre" ) {
boolean isSummer = true;
}
else {
boolean isSummer = false;
}
return false;
}
Hay que hacer comparaciones con el atributo mes de esta clase, que además NO ES UN STRING.
Es un enumerado de tipo
enumMes.
Así que hay comparar los enumerados y garantizar que hay un return true y un return false
public boolean isSummer(){
if (mes == enumMes.JUNIO || mes == enumMes.JULIO || mes == enumMes.AGOSTO || mes == enumMes.SEPTIEMBRE)
return true;
else
return false;
}
Sobre el método toString, solo comentar dos mejoras.
Una, es ponerle al principio la etiqueta
@OverrideNo es obligatorio, pero sí muy recomendable ponerla siempre que vamos a sobreescribir un método.
El método toString(), es un método que TODAS las clases Java heredan de la clase
ObjectAl escribirle un código, estamos sobreescribiendo ese método heredado. Y es muy recomendable señalarlo con la etiqueta Override, para que tanto Java, como otro programador que vaya a leer tu código, inmediatamente sepa que ese método está siendo sobreescrito
La otra mejora es añadir espacios en blanco a las palabras " de ", para que no salga todo junto
@Override
public String toString(){
return dia + " de "+ mes +" de "+ anio;
}
Bueno, ya tendríamos las clase
Fecha corregida.
La pongo completa, tal y como la tengo yo ahora:
public class Fecha {
public enum enumMes {
ENERO, FEBRERO, MARZO, ABRIL, MAYO, JUNIO, JULIO, AGOSTO, SEPTIEMBRE, OCTUBRE, NOVIEMBRE, DICIEMBRE
}
private enumMes mes;
private int dia;
private int anio;
public Fecha(enumMes mes){
dia = 0;
anio = 0;
this.mes = mes;
}
public Fecha(int dia, enumMes mes, int anio){
this.dia = dia;
this.mes = mes;
this.anio = anio;
}
public int getDia(){
return dia;
}
public void setDia(int dia){
this.dia = dia;
}
public enumMes getMes(){
return mes;
}
public void setMes(enumMes mes){
this.mes = mes;
}
public int getAnio(){
return anio;
}
public void setAnio(int anio){
this.anio = anio;
}
public boolean isSummer(){
if (mes == enumMes.JUNIO || mes == enumMes.JULIO || mes == enumMes.AGOSTO || mes == enumMes.SEPTIEMBRE)
return true;
else
return false;
}
@Override
public String toString(){
return dia + " de "+ mes +" de "+ anio;
}
}
Vamos a tu main, donde también hay algunos fallos.
El primero es que el objeto Fecha lo inicializas con un constructor que no recibe nada.
El enunciado del ejercicio dice que hay dos constructores, uno recibe el mes y otro recibe todos los datos.
No debería haber ningún constructor que no reciba nada.
Luego, el dia y el año los inicializas en unas variables separadas que no tienen ninguna relación con ese objeto Fecha.
Por cierto, para poder indicarle uno de los meses declarados en enumMes, como este enumerodo está dentro de la clase Fecha, hay que poner primero su nombre.
Fíjate cómo le paso un mes al primer constructor.
public class Principal {
public static void main(String[] args) {
System.out.println("Primera fecha");
//Primer constructor, recibe solo el mes
Fecha objFecha1 = new Fecha(Fecha.enumMes.AGOSTO);
//Configuramos dia y año
objFecha1.setDia(10);
objFecha1.setAnio(2000);
//Mostramos fecha, para esto hemos sobreescrito el método toString() de Fecha
System.out.println(objFecha1);
//Indicamos si es verano o no, usamos operador ternario
System.out.println(objFecha1.isSummer()?"Es verano":"No es verano");
System.out.println("\nSegunda fecha");
//Segundo constructor, recibe todos los datos
Fecha objFecha2 = new Fecha(20, Fecha.enumMes.OCTUBRE, 2021);
//Mostramos solo el año
System.out.println("Año: " + objFecha2.getAnio());
//Fecha completa
System.out.println(objFecha2);
//Comprobamos si es verano
System.out.println(objFecha2.isSummer()?"Es verano":"No es verano");
}
}
Al ejecutar, vemos en pantalla como se muestran las fechas y como se comprueba si son fechas de verano o no:
Primera fecha
10 de AGOSTO de 2000
Es verano
Segunda fecha
Año: 2021
20 de OCTUBRE de 2021
No es verano
Y ya estaría.
Revisa el código y comprueba que entiendes cada línea.
Cualquier cosa que no te haya quedado clara, solo tienes que preguntar.
Un saludo.