Mit Oberklasse "protected final" - Methoden zu halten common code for Unterklassen
Als (pedantisch) Anfänger Java Programmierer würde ich gerne wissen, ist es eine gute Praxis zu bewegen, eine gemeinsame code-block, der alle Unterklassen verwenden, um eine separate geschützt (letzten) - Methode in der übergeordneten Klasse? Aufgaben wie das ausfüllen von Listen mit gemeinsame Werte oder gemeinsame Filterung-algorithmen, etc...
Ist es gut, auch geschützt statische Methoden?
class A {
protected final List<String> getVariants() {...}
protected final List<String> filterResults(List<String> variants) {...}
}
class B extends A {
public List<String> doSomethingUsefull() {
List<String> commonVariants = getVariants();
...
return filterResults(commonVariants);
}
}
class C extends A {
public void doSomethingUsefull() {
List<String> commonVariants = getVariants();
...
return filterResults(commonVariants);
}
public void doMoreUsefullThings() {
List<String> commonVariants = getVariants();
...
return filterResults(commonVariants);
}
}
InformationsquelleAutor dmzkrsk | 2011-10-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie ein Java Anfänger, und denken Sie über diese Art der Dinge, dann ist jetzt eine gute Zeit und Lesen Sie Kapitel 4 "Klassen und Schnittstellen" in einem Buch mit dem Titel "Effective Java." Die Informationen, es wird mehr Gründliche und differenzierte, als die Antworten, die Sie hier erhalten.
Hier ist ein Weg, zu denken, über das mischen der
final
,protected
, undstatic
keywords:static
denn es bricht das OO-Paradigma.final
Keywords verhindern, dass Unterklassen eine Methode überschreiben, wie gut. In dieser Hinsicht, das Ergebnis ist das gleiche wie mitstatic
.final
sollte häufiger genutzt werden, und es ist eine gute Idee, es zu benutzen zusammen mitprotected
. Siehe Punkt 17 in "Effective Java".protected
undstatic
sind nicht zusammen verwendet sehr oft. Sie würde sein mischen OO-Konstrukt ein Konstrukt, das bricht normal OO Verhalten, so dass die Kombination ist seltsam.statisch ist nicht so böse... Bloch empfiehlt seine Verwendung für die Herstellung von Fabriken, zum Beispiel. Und natürlich wollen wir nicht möchten, Math.floor() zu verlangen, eine Instanz von Math! Es kann hilfreich sein, ist aber mit Vorsicht verwendet werden, natürlich.
Ich bin damit einverstanden, aber ein purist habe einmal versucht, um mich davon zu überzeugen, genau das Gegenteil: dass die
Math
Methoden, sollten Sie NICHT statisch sein!Statik sind immer potentiell gefährlich, mit Tests oder multithreading im Auge. Natürlich gibt es viele berechtigte Gründe für die Verwendung von Statik.
InformationsquelleAutor jtoberon
Scheint es vernünftig zu mir - obwohl, möchten Sie vielleicht, um
A
abstrakte als auch. Berücksichtigen Sie auch die Verwendung der Zusammensetzung statt - könnteB
undC
enthalten eineA
statt vererben?Scheint so, dass kann ziemlich gut funktionieren, in meinem Fall. Ich werde versuchen, dass!
InformationsquelleAutor Jon Skeet
Erstens, sollten Sie nicht verwenden, erstreckt sich zu diesem Zweck, weil zu viel zu erweitern, sind immer eine schlechte Idee.
Zweitens, Du hast vollkommen Recht, Sie wiederholen Sie nicht Ihren code, sondern die Gruppierung, die es durch wiederholte Teil des Codes ist nicht eine gute Wahl. Bevorzugter Weg ist, um die Gruppierung der Dinge sein, die Bedeutung in der realen Welt, von der Ebene der Abstraktion.
Last but not least, Wenn Sie Zweifel haben: getrennt oder nicht, die Erweiterung oder Zusammensetzung, geschützt endgültige oder nur geschützt wird, versuchen Sie schreiben unit-test für diese Klasse und die Antworten sehr schnell kommen.
InformationsquelleAutor smas
Ich würde vorschlagen, um alle diese Methoden, separate statische Klasse, wenn Sie verlassen Sie sich nicht auf einige Klasse Felder. Machen Sie util-Methoden.
InformationsquelleAutor Nikita Beloglazov