Object statt konkreter Klasse

Aus Programmieren-Wiki
🚧 Diese Seite befindet sich in Bearbeitung 🚧
🤓 Diese Seite ist eine Bewertungsrichtlinie, die ab Blatt 2 annotiert und ab Blatt 3 abgezogen wird. 🤓

Beschreibung

Die Object-Klasse liegt jeder Klasse und jedem Datentyp in Java zugrunde. Entsprechend könnten wir das auch ausnutzen, um damit Funktionalitäten generisch zu gestalten.

Allerdings gilt immer, dass Datentypen so allgemein wie möglich und konkret wie nötig gewählt werden sollen. Dafür ist Object zu generisch, da auf einem als Object-deklariertem Objekt keine nützlichen Methoden aufgerufen werden können, ohne das Objekt explizit zum benötigten Datentyp zu casten. Stattdessen bietet das JDK bspw. Generics, die dafür da sind, generische Strukturen aufzubauen, ohne dabei zu generisch zu werden.


Negativbeispiel

public class Pair {
    private Object first;
    private Object second;
    public Pair(Object first, Object second) {
        this.first = first;
        this.second = second;
    }
    public Object getFirst() {
        return first;
    }
    public Object getSecond() {
        return second;
    }
}
 
public static void main(String [] args) {
    Date startTime = /* get start time*/
    Date endTime = /* get end time*/ 
    Pair timeSpan = new Pair(startTime, endTime);
    //some code ...
    if(((Date) timeSpan.getFirst()).before(now) && ((Date) timeSpan.getSecond()).before(now)) {
        System.out.println("Current time within timespan");
    }
}

Positivbeispiel

public class Pair<T> {
    private T first;
    private T second;
    public Pair(T first, T second) {
        this.first = first;
        this.second = second;
    }
    public T getFirst() {
        return first;
    }
    public T getSecond() {
        return second;
    }
}
 
public static void main(String [] args) {
    Date startTime = /* get start time*/
    Date endTime = /* get end time*/ 
    Pair timeSpan = new Pair<Date>(startTime, endTime);
    //some code ...
    if(timeSpan.getFirst().before(now) && timeSpan.getSecond().before(now) {
        System.out.println("Current time within timespan");
    }
}