java data i klasy

java data i klasy
S2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
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

Kopiuj
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

Kopiuj
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

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1912
0

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

Charles_Ray
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1912
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?

S2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
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ć

S2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
0

Poprawiłam całość

Kopiuj
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);
    }

}
Kopiuj
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

Kopiuj
private boolean Checkday(int day){
        return(0 <= day) && (day <= 31);
UR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 360
2

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

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5025
1

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

S2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
0

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

UR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 360
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

S2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
0

Jak to napisać bo nie potrafię

Kopiuj
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

TE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
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ś:

Kopiuj
    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:

Kopiuj
    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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.