Komposition

Shantox

Mitglied
Hallo,
ich habe 2 Klassen gegeben: Verzeichnis und Ressource. Meine Aufgabenstellung ist: Bevor eine Ressource in ein neues Verzeichnis eingefügt werden darf, muss die aus ihrem bisherigen Verzeichnis, falls vorhanden, entfernt werden.
Meine Frage: Wie überprüfe ich, in diesem Fall, ob eine Ressource bereits in einem Verzeichnis ist?

Java:
public class Verzeichnis extends Ressource {
    protected Set<Ressource> inhalte;
    public Verzeichnis() {
        inhalte = new HashSet<Ressource>();
    }
    public boolean addInhalt(Ressource inhalt) {
        if (inhalte.add(inhalt)) {
            inhalt.setVerzeichnis(this);
            return true;
        }
        return false;
    }
    public boolean removeInhalt(Ressource inhalt) {
        if (inhalte.remove(inhalt)) {
            inhalt.setVerzeichnis(null);
            return true;
        }
        return false;
    }
    public Set<Ressource> getInhalte() {
        return Collections.unmodifiableSet(inhalte);
    }

public abstract class Ressource {
    protected Verzeichnis verzeichnis;
    public Verzeichnis getVerzeichnis() {
        return verzeichnis;
    }
    public void setVerzeichnis(Verzeichnis verzeichnis) {
        if (verzeichnis != null && !verzeichnis.getInhalte().contains(this)) {
            verzeichnis.addInhalt(this);
        }
        this.verzeichnis = verzeichnis;
    }
}

Mit freundlichen Grüßen
 

Shantox

Mitglied
Ich hab jetzt versucht in der addInhalt Methode die Komposition zu implementieren. Meine Idee ist es, falls die Ressource bereits in einem Verzeichnis ist, wird sie aus diesem gelöscht und in das neue Verzeichnis eingefügt.

Java:
public boolean addInhalt(Ressource inhalt) 
        if(getVerzeichnis() != null) {
            inhalt.setVerzeichnis(null);
            inhalt.setVerzeichnis(this);
        }
        else if(inhalte.add(inhalt)) {
            inhalt.setVerzeichnis(this);
            return true;
        }
        return false;
    }

inhalt.setVerzeichnis(null); ist nicht ganz korrekt oder? Damit tue ich ja das "aktuelle" Verzeichnis referenzieren und nicht das was gelöscht werden muss richtig?
 

mrBrown

Super-Moderator
Mitarbeiter
inhalt.setVerzeichnis(null); ist einfach überflüssig, da du es direkt danach auf this setzt.
Allerdings ist dein if falsch - da musst du inhalt.getVerzeichnis() nutzen
 

Shantox

Mitglied
Aber irgendwie muss ich die Ressource doch aus dem aktuellen Verzeichnis löschen und in das neue packen. Mit inhalt.setVerzeichnis(this) stecke ich die Ressource ja ins neue Verzeichnis. Lediglich das löschen aus dem alten Verzeichnis fehlt richtig?
 

Shantox

Mitglied
Java:
public boolean addInhalt(Ressource inhalt) {
        if(inhalte.add(inhalt) && inhalt.getVerzeichnis() == null) {
            inhalt.setVerzeichnis(this);
            return true;
        }
        else if(inhalt.getVerzeichnis() != null && inhalte.add(inhalt)) {
            verzeichnis.removeInhalt(inhalt);
            inhalt.setVerzeichnis(this);
            return true;
        }
        return false;
    }

So. Es funktioniert sonst alles bis aufs löschen
 

mrBrown

Super-Moderator
Mitarbeiter
Mit verzeichnis.removeInhalt(inhalt); löscht du die Ressource aus dem Verzeichnis, in dem dein Verzeichnis, dem du die Resource hinzufügen willst, liegst. Du solltest die Ressource aber aus dem Verzeichnis, in dem sie liegt, löschen
 

Harry Kane

Top Contributor
Das gehört an den Anfang deiner addInhalt-Methode:
Java:
Verzeichnis altesVerzeichnis = inhalt.getVerzeichnis();
if(altesVerzeichnis != null){
    altesVerzeichnis.removeInhalt(inhalt);
}
 

Ähnliche Java Themen

Neue Themen


Oben