Olá, estou estudando Java, e recebi o seguinte exercício abaixo e consegui fazer sem muitos problemas, mas estou achando que a classe ficou muito grande. Como foi eu que fiz, consigo ler tudo sem problemas, mas fico pensando se outra pessoa conseguiria entender sem problemas ou se fariam de outra forma pra ficar mais legivel. Lembrando que fiz a classe utilizando os conceitos que eu conheço até o momento.
Por isso gostaria da opinião de vocês para melhorar. Obrigado.
Segue exercício:
Crie uma classe Date com as seguintes capacidades:
a) Gerar saída da data em múltiplos formatos, como
MM/DD/YYYY
June 14, 1992
DDD YYYY
b) Utilizar construtores sobrecarregados para criar objetos Date inicializados com datas dos formatos na parte (a). No primeiro caso o construtor deve receber três valores inteiros. No segundo caso deve receber uma String e dois valores inteiros. No terceiro caso deve receber dois valores inteiros, o primeiro representando o número de dias no ano. [Dica: para converter a representação de String do mês em um valor numérico, compare as String s utilizando o método equals . Por exemplo, se s1 e s2 forem String s, a chamada de método s1.equals ( s2 ) retorna true se as String s forem idênticas e, caso contrário, retorna false.
Segue minha classe Date:
public class Date {
private int day;
private int month;
private int year;
private int daysOnYear;
private String monthString;
public Date(String month, int day, int year){
setYear(year);
setMonthString(month);
for(Months months : Months.values()){ //configure variable int month
if(months.toString().equalsIgnoreCase(month)){
this.month = months.getNumberMonth();
}//end if
}//end for
setDay(day);
calculateDaysOnYear();
}
public Date(int days, int year){
setYear(year);
calculateDate(days, year);
setDaysOnYear(days);
}
public Date(int day, int month, int year){
setYear(year);
setMonth(month);
setDay(day);
transformMonthInString(month);
calculateDaysOnYear();
}
private void setDaysOnYear(int days){
this.daysOnYear = (days > 0 && days < 366 ? days : 1);
}
private void setMonthString(String monthString){
this.monthString = monthString;
}
private void transformMonthInString(int month){
for(Months months : Months.values()){
if(months.getNumberMonth() == month){
this.monthString = months.toString();
}
}
}
private void setDay(int day){
int numberOfDays = 0;
for(Months month : Months.values()){
if(month.getNumberMonth() == this.month){ //check the number of days the month chosen in enum Months
if(month.getNumberMonth() != 2){
numberOfDays = month.getDays(); // config the numberOfDays as the number max of the month
break;
}else{//end of if
numberOfDays = checkBissextile(this.year); //if month = 2 then check if month = 29 or 28 (bissextile)
break;
}//end of else
}//end of if
}//end of for
this.day = (day < 0 || day > numberOfDays ? 1 : day); //check if day is larger than (MONTH CHOSEN) or lesser than 0
}//end of setDay
private void setMonth(int month){
this.month = (month >= 1 && month <= 12 ? month : 1); //check if month is larger than 1 and lesser than 12
}//end of setMonth
private void setYear(int year){
this.year = year;
}
private void calculateDaysOnYear(){
for(Months months : Months.values()){
if(months.getNumberMonth() < month){
if(months.getNumberMonth() != 2){
daysOnYear += months.getDays();
}else{
daysOnYear += checkBissextile(year);
}//end if else
}else if(months.getNumberMonth() == month){
daysOnYear += day;
}
}//end for
}//end of calculateDays
private void calculateDate(int days, int year){
for(Months month : Months.values()){
this.month++;
if(month.getNumberMonth() != 2){
if(days > month.getDays()){
days -= month.getDays();
}else{
this.day = days;
break;
}//end of if else
}else{
if(days > checkBissextile(year)){
days -= checkBissextile(year);
}else{
this.day = days;
break;
}
}
}
transformMonthInString(this.month);
}//end of calculateDate()
private int checkBissextile(int year){ //check if the year is bissextile and return the number of february's day
if(year % 4 == 0 && year % 100 != 0 && year % 400 == 0){
return 29;//if the year is bissextile return true
}else{
return 28;//if the year isn't bissextile return false
}
}//end of checkBissextile
public String toString(){
return String.format("%02d/%02d/%d", month, day, year);
}
public String daysOnYearString(){
return String.format("%03d %d", daysOnYear, year);
}
public String toUniversalString(){
return String.format("%s %02d, %d", monthString, day, year);
}
}//end Class