Checkstyle - Design for Extension

Status
Nicht offen für weitere Antworten.

NTB

Bekanntes Mitglied
Hiho,

ich habe mir das Checkstyle Plugin für Eclipse installiert. Checkstyle prüft den Code auf Konventionen und Coding Standards. Alleine schon, um mich daran zu erinnern, meinen eigenen Kram immer schön brav Du dokumentieren, ist das Plugin fein (aber auch anstrengend - wer dokumentiert schon jede Variable *g*).

Es sei folgender Code gegeben:

Code:
public class Foo {

    public String getHelloWorld() {
        return "Hello World";
    }
}

bei der Methode moniert Checkstyle folgendes:

Code:
Design For Extension: Die Methode 'getHelloWorld' ist nicht für Vererbung entworfen - 
	 muss abstract, final oder leer sein.

Mir ist nicht so ganz klar, warum sie so nicht für Vererbung geeignet ist.
Im Fall von Final kann sie von einem erbenden eben nicht überschrieben werden.
Im Fall von abstract wäre die Methode halt nicht ausformuliert. Wobei dann doch die gesamte Klasse abstract sein müsste, oder nicht?
Warum ist aber die Methode besser für Vererbung geeignet, wenn sie leer ist?

Wenn ich z.B. einen BusinessController habe, dann würde ich die Methode "final" deklarieren. Geht von Euch tatsächlich jemand so vor, dass er solche Methoden alle als final deklariert?
 

Ullenboom

Bekanntes Mitglied
Hallo!

Bei Checkstyle habe ich mich auch schon zweimal an den Autor gewandt, weil ich einmal die Beschreibung unpräzise fand und zum anderen die Prüfung nicht vollständig war. Ich rätsele da auch immer und bei einer Meldung wie "Design For Extension" würde ich mir auch was Besseres wünschen. Der Grund aber, warum Checkstyle bei deinem Beispiel viel lieber

Code:
public class Foo {
    public final String getHelloWorld() {
        return "Hello World";
    }
}

sehen möchte ist der, dass man nicht-finale Methoden "aus versehen" überschreiben kann und somit unabsichtlich das Template-Pattern implementiert. Etwa bei folgendem Beispiel:

Code:
class A
{
  A() { a(); }
  void a() { System.out.println("A");}
}

class B extends A
{
  B() { a(); }
  void a() { System.out.println("B");}
  public static void main( String[] args ) { new B(); }
}

Hier wird bei new B(); zweimal a() aus B aufgerufen, was sicherlich nicht beabsichtigt war, da man denkt, das der Konstruktor A() auch "sein" a() aus A aufruft. Daher wird man a() aus A üblicherweise auch privat machen.

Daher kann man die Meldung auch so verstehen: "Design For Extension: Die Methode 'getHelloWorld' ist aktuell für Vererbung entworfen, wird aber nicht so verwendet. Mache die Methode abstract oder final oder leer, damit nicht aus Versehen eine Unterklasse Verhalten überschreibt."

Grüße

Christian
 

NTB

Bekanntes Mitglied
Ok, also soll das verhindern, dass beim vererben (un)erwartetes (nicht) passiert :)

So hatte ich das auch angenommen.

Jetzt bleibt mir aber immer noch eine Frage offen:
Wird das wirklich so in der Praxis umgesetzt? Ich habe jetzt noch nicht explizit drauf geachtet, aber ich glaube, ich würde darüber stolpern, wenn ich Code lesen würde, bei dem mehrere Methoden als "final" deklariert sind.
 

Ullenboom

Bekanntes Mitglied
Ich finde das mit dem final (genauso wie bei lokalen Variablen) zwar sehr verbose, doch mache ich es nur für meinen internen kleinen Quicky-Programme, die keiner sieht, nicht.

Grundsätzlich finde ich das eine gute Idee, weil ich denke, dass alles im Quellcode stehen muss und so ein Modifizierer auch etwas anders als eine Compiler-Bedeutung haben muss. (Da halte ich mich an den Ausspruch "everything is in the code".) Wenn eine Methode *nicht final* ist, *wird* sie überschrieben. Wenn eine Variable *nicht final* ist, *wird* sie später überschrieben. Lässt man's weg, kann's ja beides sein.

Grüße

Christian
 

NTB

Bekanntes Mitglied
Danke für die Gedanken (währenddessen habe ich mir das in Deinem Blog gepostete PDF zu Ebays Architektur reingezogen *g*).

Vielleicht kann ich mich ja daran gewöhnen, in solchen Fällen tatsächlich die Methoden mit final zu deklarieren.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Checkstyle 100 Zeichen pro Zeile Allgemeine Java-Themen 11
B Checkstyle Allgemeine Java-Themen 6
Mr. Pink Erste Schritte Checkstyle.properties Allgemeine Java-Themen 3
D Checkstyle Plugin Allgemeine Java-Themen 4
M Frage zu Checkstyle Allgemeine Java-Themen 5
L Checkstyle: Wann ist eine Methode für Vererbung entworfen? Allgemeine Java-Themen 13
D FindBugs oder CheckStyle aus Java-Programm starten Allgemeine Java-Themen 2
T CheckStyle, JUnit und FindBugs aus Java-Programm starten Allgemeine Java-Themen 2
M Probleme mit Checkstyle , v.a. Klammersetzung Allgemeine Java-Themen 8
J Meinung zum verwendeten Design Pattern Allgemeine Java-Themen 4
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
S ArrayList Design Allgemeine Java-Themen 4
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
Kirby.exe Framework für Game Design Allgemeine Java-Themen 8
C WindowBuilder Design funktioniert nicht Allgemeine Java-Themen 0
M Diverse Design-Fragen Allgemeine Java-Themen 6
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
M OOP Design Pattern - "extends Observable implements Observer" Allgemeine Java-Themen 0
T OOP Fehler im Design Allgemeine Java-Themen 9
perlenfischer1984 Welches Design Pattern ist geegneit. Allgemeine Java-Themen 7
perlenfischer1984 Hilfe bei Design (Pattern) Allgemeine Java-Themen 5
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
R Parameter Adapter - Design Allgemeine Java-Themen 1
D Bezüglich Design meines Codes Allgemeine Java-Themen 1
D OOP Design Pattern für GUI - Datenbank Anwendung Allgemeine Java-Themen 1
S Java Design Frage Allgemeine Java-Themen 10
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
P Auf die Anzahl der Joins achten beim WS design Allgemeine Java-Themen 1
M OOP Design Frage Allgemeine Java-Themen 2
J Domain Driven Design - Modellierungsfrage Allgemeine Java-Themen 3
F Welches Design Pattern? Allgemeine Java-Themen 3
H MVC Design Allgemeine Java-Themen 9
J Swing Eigenes Button-design Allgemeine Java-Themen 2
Q Kapselung Allgemeine Design- Frage Allgemeine Java-Themen 8
Z Design um boolsche ausdrücke zu speichern & auszuwerten Allgemeine Java-Themen 3
A Sinnvolles Software Design bei Eigenschaftsänderungen von Objekten Allgemeine Java-Themen 7
C Gutes Code Design (3 Schichten Modell) Allgemeine Java-Themen 19
D Design Stations-Gitter Allgemeine Java-Themen 4
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
L Software-Design: Kommunikation mit SerialPort (RXTX) Allgemeine Java-Themen 2
D [Drag&Drop] Design-Pattern-Frage Allgemeine Java-Themen 4
G Design Patterns für Programm Allgemeine Java-Themen 3
I Wie populär ist Design by Contract in Java und was haltet ihr davon? Allgemeine Java-Themen 5
Landei Design-Problem Formel-Parser Allgemeine Java-Themen 10
J Aktionen im State-Design-Modell Allgemeine Java-Themen 3
S Design Oberfläche Allgemeine Java-Themen 2
L Design-Frage: Platzierung der Save-Methode Allgemeine Java-Themen 3
G Domain Driven Design Model Allgemeine Java-Themen 14
G konkretes Domain Driven Design Aggregate Allgemeine Java-Themen 2
ruutaiokwu welches design pattern? frage an die oo-experten unter euch... Allgemeine Java-Themen 3
G Accordion Design Pattern Frage Allgemeine Java-Themen 2
hdi Hilfe beim Design (Stichwort OO, Pattern, ...) Allgemeine Java-Themen 11
B Design Problem Allgemeine Java-Themen 8
faulelotte Verständnisproblem Domain Driven Design Allgemeine Java-Themen 3
S Frage zum Design der Datenstruktur Allgemeine Java-Themen 10
D design gesucht - Angabe von zu ersetzenden substrings Allgemeine Java-Themen 2
D Design ohne Getter und Setter Allgemeine Java-Themen 8
D Design: on-the-fly-Parsing + Datenstrukturen Allgemeine Java-Themen 5
N Welches design pattern? Allgemeine Java-Themen 8
D design client server Allgemeine Java-Themen 10
T Design-Frage Allgemeine Java-Themen 14
S XML-Parsing / public-Member-Variablen / Design-Frage Allgemeine Java-Themen 8
S JToolBar Design Allgemeine Java-Themen 3
M Bildersyncronisierung - Design Patterns? Allgemeine Java-Themen 2
T Design - Exception in Thread Allgemeine Java-Themen 3
G Composite, Design Pattern, printTree Allgemeine Java-Themen 42
N Design-Frage: persistent machen per Reflection Allgemeine Java-Themen 3
M Frage zum Design :: allgemein Allgemeine Java-Themen 6
M MVC Design Pattern - Verständniss Fragen Allgemeine Java-Themen 3
U Frage zu DB Design Allgemeine Java-Themen 3
K Design / Implementierung Allgemeine Java-Themen 5
F Design Pattern zur Realisierung von Mehrfachvererbung? Allgemeine Java-Themen 8
E Was ist ein gutes Design fuer meine Programm? Allgemeine Java-Themen 3
F Paket und Software Design Fragen. Allgemeine Java-Themen 5
P Apple Design Allgemeine Java-Themen 5
S design frage Allgemeine Java-Themen 10
T Design-Tipp gesucht Allgemeine Java-Themen 2
M Design von Java Klassen Allgemeine Java-Themen 2
G java design von klassen und projekten Allgemeine Java-Themen 6
K Design: Klassen in Pakete aufteilen - Eure Meinung Allgemeine Java-Themen 8
S Programmierstil / design Allgemeine Java-Themen 9
S Exception design Allgemeine Java-Themen 2
m@nu Exception-Design Allgemeine Java-Themen 4
R Design-Frage Allgemeine Java-Themen 9
N Hilfe beim Design Allgemeine Java-Themen 13
D Design Pattern: Singleton Allgemeine Java-Themen 4
Torres Design-Problem mit Jakarta Struts Allgemeine Java-Themen 2
A Anwendungs-Design (Plugin-Architektur) Allgemeine Java-Themen 4
maestr0 SVN ImportWizard Extension Allgemeine Java-Themen 9
B File umbennen ohne Extension zu aendern Allgemeine Java-Themen 2
G Java in Firefox Extension (Javascript) Allgemeine Java-Themen 3
R Java script extension Allgemeine Java-Themen 2
G Java Cryptography Extension (JCE) mit Java 1.6 noch aktuell? Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben