Zugriff auf Interfaces

Hallo, ich würde Sie bitten mal schnell zu prüfen, ob ich diese Anforderungen richtig im Code ungesetzt habe und falls nicht was ich wie verbessern kann

Klasse:

public abstract class PoweredBike implements Bike
{
    int maxRange, restRange;

    public PoweredBike(int max_Range)
    {
        if (max_Range < 0)
        {
            throw new IllegalArgumentException(
                " Die Maximalweite darf nie negativ sein");

        }
        else
        {
            max_Range = maxRange;
            max_Range = restRange;
        }
    }

    public int range()
    {

        if (restRange < 0)
        {
            throw new IllegalArgumentException(
                "ihre Restreichweite kann nie kleiner 0 sein");

        }
        else
        {
            return this.restRange;
        }
    }

    public PoweredBike drive(int km)
    {
        if (km < 0)
        {
            throw new IllegalArgumentException(" Unzulässigter Sachverhalt");

        }
        else
        {
            restRange = restRange - km;
        }

        return null;
    }

    public void fuelUp()
    {
        restRange = maxRange;

    }

    public String toString()
    {
        return "PoweredBike [maxRange=" + maxRange + ", restRange=" + restRange
            + "]";
    }

    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + maxRange;
        result = prime * result + restRange;
        return result;
    }

    public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        PoweredBike other = (PoweredBike) obj;
        if (maxRange != other.maxRange)
            return false;
        if (restRange != other.restRange)
            return false;
        return true;
    }

}

Interface

public interface Bike
{
    /**
     * Strecke in km, die das Fahrrad faehrt. * @param km Strecke in km,
     * positiv. * @return dieses Fahrrad.
     */
    Bike drive(int km);

    /**
     * Restliche Reichweite, die das Fahrrad noch fahren kann. * @return in der
     * Default Implementierung unendlich weit.
     */
    default int range()
    {
        return Integer.MAX_VALUE;
    }
}

Anforderungen:

  • int maxRange (positiv)für die maximale Reichweite dieses Fahrrads mit einer Motorladung
  • int restRange (nicht negativ, nicht mehr als die maximale Reichweite)die verbleibende Reichweite, nachdem das Fahrrad schon eine gewisse Strecke gefahren ist.Ein Konstruktor erhält maxRange als Parameter. Werfen Sie im Falle einer negativen Angabe eineIllegalArgumentException.

Die Klasse PoweredBike definiert folgende Methoden:

  • range liefert die verbleibende Reichweite.
  • drive reduziert die verbleibende Reichweite abhängig von der gefahrenen km Zahl, aber nicht unter 0. Wirft imFalle einer negativen km-Angabe eine IllegalArgumentException.
  • fuelUp setzt die verbleibende Reichweite wieder auf den Startwert.
  • toString liefert zusätzlich zu den Attributen den dynamischen Typ.
  • equals und hashCode: Zwei PoweredBike sind gleich, wenn die maximale Reichweite und die verbleibende Reichweite übereinstimmen.

Erstmal vorneweg: So ein Beitrag, in dem ein “kostenloses Code-Review” gefordert wird, sollte zumindest vernünftig formatiert sein. Hier irgendwas reinzudumpen in der Hoffnung auf ein “Level Up” ist nicht so toll.

Ansonsten: Im wesentlichen geht das grob in die richtige Richtung.

Aber du solltest das ganze mal compilieren und in einer eigenen Klasse (z.B. BikeTest) eine main-Methode erstellen, in der du mal ein PoweredBike erstellst, und einige Methoden aufrufst, um zu sehen, ob das ganze im Detail auch richtig implementiert ist. (Tipp: Ist es nicht…)

1 Like
public class PoweredBike implements Bike {
int maxRange;
int restRange;

public PoweredBike(int maxRange) {
	if (this.maxRange == 0) {
		throw new IllegalArgumentException("This is not possible your maxRange can not be a - Vallue.");
	} else {
		this.maxRange = maxRange;
		maxRange = restRange;

	}

}

public int range() {
	return this.restRange;
}

@Override
public Bike drive(int km) {
	if (restRange == 0) {
		throw new IllegalArgumentException("sie können nicht fahren AKKU leer");

	} else if (restRange < km) {
		throw new IllegalArgumentException(" Ihre Reichweite reicht nicht für diese Strecke");

	} else {
		this.restRange = restRange - km;
	}

	return null;
}

public void fuelUp() {
	if (this.restRange == this.maxRange) {
		throw new IllegalArgumentException("Kein Ladevorgang notwendig");

	} else {
		this.restRange = this.maxRange;

	}
}

@Override
public String toString() {
	return "PoweredBike [maxRange=" + maxRange + ", restRange=" + restRange + "]";
}

@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + maxRange;
	result = prime * result + restRange;
	return result;
}

@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	PoweredBike other = (PoweredBike) obj;
	if (maxRange != other.maxRange)
		return false;
	if (restRange != other.restRange)
		return false;
	return true;
}

Ist das soweit Korkt und wie ist es nun möglich aus einer anderen Klasse welche sich von dieser ableitet auf die Methoden und den Konstuktor zuzugreifen und falls notwendig neue Teile hinzuzufügen zum Beispiel Textausgabe bei Drive.

Du musst nicht nach jeder Änderung ein neues Thema erstellen. Formatier’ den Code, und formuliere die Frage richtig.

Ich wollte Marcos Antwort nicht torpedieren, aber jetzt hab ich es im anderen Beitrag schon geschrieben. Aber eigentlich gefällt mir Marcos Antwort besser, gib einem Mann einen Fisch oder lehre ihm zu Angeln.

Erst mal ein kleiner Fehler im Konstruktor ganz oben, this.maxRange ist immer 0 und löst deshalb auch immer eine IllegalArgumentException aus. Streiche das “this.”.

Zudem sollte es im Konstruktor wohl eher heißen
restRange = maxRange
und nicht anders herum.

In drive() wird null zurückgegeben, stattdessen:
return this;

Du verwendest ziemlich viele Exceptions, sicherlich nicht generell falsch, auch wenn hier IllegalArgumentException fälschlicherweise missbraucht werden. Zudem würde ich die Exceptions im Methodenkommentar erwähnen und wann sie ausgelöst werden.

In der fuelUp() Methode ist der Bogen mit der Exception dann aber überspannt. Die Überprüfung kann man komplett entfernen. Der fehlende Getter für restRange ist für mich ein Indiz das Exceptions hier als Ersatz missbraucht werden sollen.

Noch eine Frage dann geb ich aber eine Ruhe, in meiner Testklasse steht folgender Test.

@Test(timeout = 1_000) 
public void driveMaxRangePlus1() {
    int want = 0;

    sut.drive(101);
    int have = sut.range();
    
    assertEquals(want, have);
}

Können sie sich vileicht erklären warum dieser beim Testen der Klasse anschlägt, alle vorher geneannten Fehler habe ich bereits behoben.

Vielen Dank für ihre Hilfde