java data i klasy

0

Hej stworzyłam klasę w której definiuję day month i year oraz zakres. W pliku MyDateMain.java mam za pomocą displayDate wyświetlić pola z uwzględnieniem zer nieznaczących oddzielone znakiem "/", np 21/03/2051.

MyDate.java

package src;

public class MyDate {
    private int month;
    private int day;
    private int year;

    public MyDate() {
        this.month = month;
        this.day = day;
        this.year = year;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        if(Checkmonth(month))
            this.month = month;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        if(Checkday(day))
            this.day = day;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        if(Checkyear(year))
            this.year = year;
    }

    private boolean Checkmonth(int month){
    return(0 <= month) && (month <= 12);
    }
    private boolean Checkday(int day){
        return(0 <= day) && (day <= 31);
    }
    private boolean Checkyear(int year){
        return(1990 <= year) && (year <= 2050);
    }

}

MyDateMain.java

package src;

public class MyDateMain {
    public static void main(String[] args) {

        MyDate today = new MyDate();
        System.out.println(today.getDay() + "/" + today.getMonth() + "/" + today.getYear());
    }
}

w tej chwili po uruchomieniu wyświetla: 0/0/0

0

A jakich wartości się spodziewałaś?

1

Nie odpisuj w komentarzach, tylko w postach. A w którym miejscu ustawiasz datę bieżąca? Z tego co widzę, to konstruktor przypisuje pola na same siebie, czyli zera. W Javie bieżącą datę uzyskujemy przez zawołanie np. LocalDateTime.now()

A może w zadaniu chodzi o to, żeby przekazać dowolny dzień, miesiąc i rok w konstruktorze?

0

Tak wygląda treść
Zaimplementuj klasę MyDate, która przechowuje informację: month (typu int), day(typu int) i year (type int). Klasa powinna zawierać konstruktor, który inicjalizuje zmienne, sprawdzając poprawność zakresów (day 0-31, month 0-12, year 1990-2050). Zaimplementuj methody set i get dla wszystkich pól. Dodaj metodę displayDate, która wyświetli pola z uwzględnieniem zer nieznaczących oddzielone znakiem "/", np 21/03/2051. Przetestuj zaimplementowaną klasę.
Jeśli chodzi o dowolną datę to wiem co robić

0

Poprawiłam całość

package src;

public class MyDate {
    private int day;
    private int month;
    private int year;

    public MyDate(int day,int month , int year) {
        this.day = day;
        this.month = month;
        this.year = year;
    }
    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        if(Checkday(day))
            this.day = day;
    }
    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        if(Checkmonth(month))
            this.month = month;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        if(Checkyear(year))
            this.year = year;
    }
    private boolean Checkday(int day){
        return(0 <= day) && (day <= 31);
    }
    private boolean Checkmonth(int month){
    return(0 <= month) && (month <= 12);
    }
    private boolean Checkyear(int year){
        return(1990 <= year) && (year <= 2050);
    }

}
package src;

public class MyDateMain {
    public static void main(String[] args) {

        MyDate today = new MyDate(30, 5, 2009);
        System.out.println(today.getDay() + "/" + today.getMonth() + "/" + today.getYear());
        MyDate tomorrow = new MyDate(32, 5, 2009);
        System.out.println(tomorrow.getDay() + "/" + tomorrow.getMonth() + "/" + tomorrow.getYear());
    }
}

Tylko teraz datę 32/5/2009 też wyświetla, dlaczego skoro mam

private boolean Checkday(int day){
        return(0 <= day) && (day <= 31);
2

Bo w konstruktorze nie używasz tego warunku sprawdzającego.

1

getDay zwraca day, nie używając, CheckDay, (czemu nazwy metod z dużej litery?)
EDYCJA: Albo, jak wyżej, sprawdzaj w konstruktorze.

0

Jak użyć warunku sprawdzającego w konstruktorze?

1

Tak samo jak w metodach setMonth, setYear itd.

Tylko zauważ że tutaj tracisz spójność działania, bo nie ma żadnego komunikatu/błędu o niepoprawnej dacie. Jak warunek nie zostanie spełniony, to za liczbę podana przez użytkownika nie zostanie podstawione nic, czyli będą tam zera.
Ale to czy jest to poprawne, zależy już od wymagań i preferencji zalecanego wykładowcy.

Plus można tam zrobić takie kwiatki jak ustawić datę typu 31 luty, 31 czerwca, nie uwzględniasz lat przestępnych itd

0

Jak to napisać bo nie potrafię

MyDate today = new MyDate(30, 5, 2009);
        if (0 <= today.getDay() && today.getDay() <= 31) {
            return true;
        } else
            return false;
        }
        System.out.println(today.getDay() + "/" + today.getMonth() + "/" + today.getYear());
        MyDate tomorrow = new MyDate(32, 5, 2009);
        System.out.println(tomorrow.getDay() + "/" + tomorrow.getMonth() + "/" + tomorrow.getYear());

tak nie działa

1

@stokrotka221b: Chwileczkę. Twoja odpowiedź byłaby dobra z tymi booleanami w setterach, gdybyś użyła jeszcze konstruktora bezargumentowego i wtedy w mainie zmodyfikowała kod o takie coś:

    public static void main(String[] args) {

        MyDate today = new MyDate(30, 5, 2009);
        System.out.println(today.getDay() + "/" + today.getMonth() + "/" + today.getYear());
        MyDate tomorrow = new MyDate();
        tomorrow.setDay(32);
        tomorrow.setMonth(13);
        tomorrow.setYear(2009);
        System.out.println(tomorrow.getDay() + "/" + tomorrow.getMonth() + "/" + tomorrow.getYear());
    }

Ale zadanie musisz wykonać tak jak tego oczekuje jego treść, czyli, że masz walidację tych pól przeprowadzić w konstruktorze. Sama się zaśmiejesz, bo ten kod jest bajecznie prosty w modyfikacji:

    public MyDate(int day,int month , int year) {
        if(Checkday(day))
        this.day = day;
        if(Checkmonth(month))
        this.month = month;
        if(Checkyear(year))
        this.year = year;
    }

P.S. W zadaniu mówią jeszcze o walidacji, w przypadku podania takich danych jak: dzień 1 - 9, gdzie ma być wyświetlone jako 01 - 09 oraz to samo w przypadku miesięcy. Musisz zapisać to w metodzie > displayDate

1 użytkowników online, w tym zalogowanych: 0, gości: 1