- COMP.CS.140
- 5. Periytyminen
- 5.5 ⌛ Päivämäärä ja aika
⌛ Päivämäärä ja aika¶
Tehtävän palautus koostuu Maven-projektista. Sijoita pom.xml
-tiedosto paikallisen tietovarastosi
round5/datetime
-hakemistoon ja tee tähän hakemistoon src/main/java
-niminen alihakemisto.
Tee luokkatiedostot Date.java, DateTime.java ja DateException.java ja liitä ne
fi.tuni.prog3.datetime
-nimiseen pakkaukseen. Tiedostojesi tulee olla siten hakemistossa
round5/datetime/src/main/java/fi/tuni/prog3/datetime
.
Tässä tehtävässä tutustutaan perintään toteuttamalla seuraavat luokat päivämäärän ja kellonajan käsittelyyn.
Luokka
Date
, joka tallettaa päivämäärän eli päivän, kuukauden ja vuoden. Julkiset jäsenet:Rakennin
Date(int year, int month, int day)
, joka alustaa olion kuvaamaan parametrien mukaista päivämäärää. Rakennin tarkistaa, onko päivämäärä laillinen, ja ellei se ole, heittää rakenninDateException
-poikkeuksen, jolla on muotoa “Illegal date day.month.year” oleva viesti. Päivä ja kuukausi esitetään kahdella numeromerkillä. vinkki:String.format
ja"%02d"
muotoilumäärittely.Voit käyttää päivämäärän tarkistamiseen esimerkiksi aiemmassa materiaalissa esitettyä päivämäärän tarkistusesimerkkiä.
Jäsenfunktiot
int getYear()
,int getMonth()
jaint getDay()
, jotka palauttavat nimiään vastaavat jäsenmuuttujat.Jäsenfunktio
String toString()
, joka palauttaa olion päivämäärän muodossa “day.month.year” esittävän merkkijonon. Päivä ja kuukausi esitetään kahdella numeromerkillä.
Luokka
DateTime
, joka perii luokanDate
ja joka itse tallettaa lisäksi kellonajan eli tunnit, minuutit ja sekunnit. Julkiset jäsenet:Rakennin
DateTime(int year, int month, int day, int hour, int minute, int second)
, joka alustaa olion kuvaamaan parametrien mukaista päivämäärää ja kellonaikaa. Rakennin tarkistaa, onko kellonaika laillinen (tunnit 0–23, minuutit ja sekunnit 0–59), ja ellei se ole, heittää rakenninDateException
-poikkeuksen, jolla on muotoa “Illegal time hour:minute:second” oleva viesti. Kukin kellonajan osa esitetään kahdella numeromerkillä.Jäsenfunktiot
int getHour()
,int getMinute()
jaint getSecond()
, jotka palauttavat nimiään vastaavat jäsenmuuttujat.Jäsenfunktio
String toString()
, joka palauttaa merkkijonon, jossa on ensin yliluokanDate
toString
-funktion tuottama merkkijono, sitten välilyönti, ja sitten kellonaika muodossa “hour:minute:second”. Kukin kellonajan osa esitetään kahdella numeromerkillä.Funktiossa voi kutsua yliluokan
toString
-funktiota avainsanansuper
avulla tapaansuper.toString()
. Suorita tämä kutsu, ja liitä sen palauttaman merkkijonon perään välilyönti ja kellonaika.
Luokka
DateException
, joka perii Javan luokkakirjaston luokanException
ja jolla on muotoaDateException(String msg)
oleva rakennin, joka välittää parametrinmsg
yliluokanException
rakentimelle.
Automaattiset sekä alla kuvatut testit olettavat, että teet projektitiedostoosi pom.xml
seuraavat määritykset:
artifactId
-elementin arvo ondatetime
.version
-elementin arvo on1.0
.maven.compiler.source
jamaven.compiler.target
-elementtien arvo on17
tai pienempi. Tarkistimella on asennettuna Java 17, joten tätä uudempaa versiota ei voi käyttää.Onejar-liitännäisen määritys, jonka
mainClass
-elementin arvo onDateTimeTest
, joka on alla kuvattu valmiina annettu testiluokka.
Esimerkkitestejä¶
Automaattiset testit testaavat luokkiasi suunnilleen seuraavanlaisella testiohjelmalla:
import java.util.ArrayList;
import fi.tuni.prog3.datetime.Date;
import fi.tuni.prog3.datetime.DateException;
import fi.tuni.prog3.datetime.DateTime;
public class DateTimeTest {
public static void main(String args[]) {
ArrayList<Date> dates = new ArrayList<>();
for (String arg : args) {
try {
String[] parts = arg.split(" ");
if (parts.length == 3) {
dates.add(new Date(Integer.parseInt(parts[0]), Integer
.parseInt(parts[1]),
Integer.parseInt(parts[2])));
} else if (parts.length == 6) {
dates.add(new DateTime(Integer.parseInt(parts[0]), Integer.parseInt(
parts[1]), Integer.parseInt(parts[2]), Integer
.parseInt(parts[3]), Integer.parseInt(parts[4]), Integer
.parseInt(parts[5])));
}
} catch (DateException e) {
System.out.println(e);
}
}
for (int i = 0; i < dates.size(); i++) {
System.out.format("Date #%d: %s%n", i + 1, dates.get(i));
}
}
}
Alla on kuvattu esimerkiksi kaksi testiohjelman suoritusta odotettuine tuloksineen:
java -jar target/datetime-1.0.one-jar.jar "2015 1 1" "1999 12 31 23 59 59" "2012 13 20"
fi.tuni.prog3.datetime.DateException: Illegal date 20.13.2012
Date #1: 01.01.2015
Date #2: 31.12.1999 23:59:59
java -jar target/datetime-1.0.one-jar.jar "1998 01 24" "1999 02 03 17 60 17" "2010 01 20 6 55 12" "2012 07 28" "2021 02 02"
fi.tuni.prog3.datetime.DateException: Illegal time 17:60:17
Date #1: 24.01.1998
Date #2: 20.01.2010 06:55:12
Date #3: 28.07.2012
Date #4: 02.02.2021
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.