Frage

Ich benutze das Scanner-Klasse für das Lesen von mehreren ähnlichen Dateien.Ich möchte es verlängern, um sicherzustellen, dass Sie alle die gleiche Trennzeichen und ich kann auch hinzufügen, die Methoden wie skipUntilYouFind(String thisHere) das alles gilt für Sie alle.

Kann ich eine utility-Klasse, die Sie enthalten, oder Betten Sie die Scanner-Klasse als eine variable, die innerhalb einer anderen Klasse, aber das ist umständlicher.

Ich habe gefunden einige Gründe deklarieren Sie eine Klasse, Finale, aber warum ist es hier getan?

War es hilfreich?

Lösung

Wahrscheinlich, weil es verlängern und überschreiben einige Methoden würde wahrscheinlich brechen.Und machen es einfacher zu überschreiben Methoden hätte setzen zu viel in das Innenleben, so dass, wenn in Zukunft werden Sie entscheiden, ob Sie diese aus performance-oder anderen Gründen), wäre es für Sie schwieriger sein, die Klasse zu wechseln, ohne zu brechen alle Klassen, die Sie erweitern.

Betrachten Sie beispielsweise die folgende Methode in der Klasse:

public boolean nextBoolean()  {
    clearCaches();
    return Boolean.parseBoolean(next(boolPattern()));
}

Sagen Sie, dass Sie überschreiben möchten, weil Sie möchten zu 'awesome' bewerten, um eine 'echte' boolean (warum auch immer).Wenn Sie überschreiben, Sie können nicht aufrufen, super.nextBoolean(), denn das würde zu verbrauchen, das nächste token mit der default-Logik.Aber wenn Sie nicht, rufen Sie super.nextBoolean(), clearCaches() nicht aufgerufen werden, möglicherweise brechen die anderen Methoden nicht überschrieben.Sie können Sie nicht anrufen clearCaches() weil es ist private.Wenn Sie es geschützt, aber dann erkannte, dass es verursacht ein performance-problem, und wollte eine neue Implementierung, die nicht klar caches mehr, dann könnten Sie Ihre Pause überschrieben Umsetzung der noch aufrufen.

Also im Grunde ist es, so können Sie leicht ändern Sie die versteckten Teile im inneren, die Klasse, die ziemlich Komplex sind, und schützen Sie sich von einem gebrochenen Kind-Klasse (oder eine Klasse, die könnte leicht gebrochen werden).

Andere Tipps

Ich nehme an, dies ist aus Sicherheitsgründen. Diese Klasse liest die Benutzereingabe, damit jemand mit schlechten Absichten sie erweitern kann, sein Verhalten ändern und Sie geschraubt werden. Wenn es endgültig ist, ist es für den Bösen nicht so einfach, denn wenn er seine eigene Art von Scanner (nicht java.util.scanner) macht, würden die Prinzipien des Polymorphismus gebrochen. Sehen Sie, dass der Bösewicht klug genug sein kann, um ein Bot/Skript zu schreiben, das dies automatisch auf Remote -Servern ausführt.

Ich denke, dass der Link, den Sie bereitgestellt haben, alles erklärt.

In Ihrem Fall scheint es, als ob Sie sowieso Komposition anstelle der Vererbung bevorzugen sollten. Sie erstellen ein Dienstprogramm mit vordefiniertem Verhalten und können einige (oder alle) der Details der Scannerklasse verbergen.

Ich habe viele Implementierungen gesehen, die die Vererbung verwendet haben, um ein Verhalten zu ändern. Das Endergebnis war normalerweise ein monolithisches Design und in einigen Fällen ein gebrochener Vertrag und/oder gebrochenes Verhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top