Mit Subklassifizieren eine Java-Klasse zu ersetzen, die nicht über eine Schnittstelle nicht implementiert

StackOverflow https://stackoverflow.com/questions/355732

  •  21-08-2019
  •  | 
  •  

Frage

Zum Beispiel ist java.io.File nur eine konkrete Klasse. Mein Ersatz für sie unterstützt Windows-Verknüpfungen zu lösen. Ich muß Vorprozess Konstruktorparameter möglich LNK-Dateien zu lösen, weil das Filesystem-Objekt, das auf dem abstrakten Pfad tut Normalisieren / canonicalision / Lösung nicht zugänglich ist. Die Notwendigkeit von Regeln aus reinen Subklassifizieren Vorverarbeitung - nicht Vorverarbeitung, bevor Super Aufruf (...) und Datei ist unveränderlich. So erweitere ich Datei und einen Delegaten verwenden, überschreibt alle Datei-Konstruktoren und Methoden (Aufruf Super ( „“) in allen Konstrukteuren).

Das funktioniert gut, aber es ist natürlich nicht ideal - wenn Datei ändert, werde ich keine neue Methoden oder Konstruktoren außer Kraft gesetzt hat, und dies wird den darunter liegenden leeren abstrakten Pfad aus. Bin ich etwas fehlt offensichtlich? Es scheint, wie es sollte ein einfacherer / besserer Weg sein.

War es hilfreich?

Lösung

Im konkreten Fall vorschlagen, dass Sie es mir sieht aus wie Sie besser sind mit einer separaten Factory-Klasse ab, die die Entscheidungen über Normalisieren / canonicalision macht / zu lösen.

Dann können Sie einfach lassen Datei-Datei sein. Einfachere.

Andere Tipps

Wenn Sie wirklich die Unterklasse Route möchten, können Sie die Anforderung betrügen, dass ein Anruf zu super() die erste Zeile eines Unterklasse Konstruktor sein muss durch Ihren Bereinigungscode außerhalb Ihrer Klasse platzieren oder in einem statischen Block:

public class MyFile extends File {

    public MyFile(String path) {

        // static blocks aren't ideal, this is just for demo purposes:
        super(cleanPath(path)); 
    }

    private static String cleanPath(String uncleanPath) {...}

}

Die Fabrik Muster von krosenvold vorgeschlagen ist auch eine gute Lösung.

  

Das funktioniert gut, aber es ist natürlich nicht ideal - wenn Datei ändert, werde ich keine neue Methoden oder Konstruktoren außer Kraft gesetzt hat, und dies wird den darunter liegenden leeren abstrakten Pfad aus. Bin ich etwas fehlt offensichtlich?

Nein, haben Sie ein Problem mit der Verwendung von Vererbung entdeckt - dass Subklassen eng erhält gekoppelt Oberklassen und ihre Einbauten, so kann es instabil sein. Deshalb Effective Java und andere sagen, Sie Delegation vor Vererbung, wenn möglich begünstigen sollte.

Ich denke, krosenvold Lösung klingt sauber.

Es scheint mir, dass krosenvold-Lösung ist der Weg zu gehen.

Aber, wenn Sie Aufzeichnungen über den ursprünglichen Pfad zu halten brauchen, der die Datei erstellt Sie können eine Wrapper-Klasse implementieren.

public class FileWrapper {

    private File file;
    private String path;

    private FileWrapper(String path) {
        this.path = path;
        file = new File(preProcess(path));
    }

    private String preProcess(String path) {
        // process
        return path;
    }

    public File getFile() {
        return file;
    }

    public String getPath() {
        return path;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top