Path: csiph.com!weretis.net!feeder7.news.weretis.net!newsreader4.netcologne.de!news.netcologne.de!.POSTED.2001-4dd3-a258-0-d47a-df5f-e9f2-edec.ipv6dyn.netcologne.de!not-for-mail From: Patrick Roemer Newsgroups: de.comp.lang.java Subject: Re: Was ist an dieser Klasse falsch? Date: Thu, 30 Jul 2020 14:22:23 +0200 Organization: news.netcologne.de Distribution: world Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Date: Thu, 30 Jul 2020 12:22:23 -0000 (UTC) Injection-Info: newsreader4.netcologne.de; posting-host="2001-4dd3-a258-0-d47a-df5f-e9f2-edec.ipv6dyn.netcologne.de:2001:4dd3:a258:0:d47a:df5f:e9f2:edec"; logging-data="21888"; mail-complaints-to="abuse@netcologne.de" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.24) Gecko/20100411 Thunderbird/2.0.0.24 Mnenhy/0.7.6.0 In-Reply-To: Content-Language: en-US Xref: csiph.com de.comp.lang.java:13350 Responding to Peter Heitzer: > Der Grund für die Ableitung der Properties Klasse ist in einem Programm von mir > gegründet. Es ist ein kleiner Webservice, der sowohl als Produktivversion als auch > als Testversion läuft. Welche Version es ist, wird beim Start durch eine Systemvariable > festgelegt, welche als Präfix dient. > Da der Service seine Parameter aus einer Datei liesst, einhält diese jeweils > einen Eintrag für Produktion und Test, z.B. Serverport=xxx bzw. TestServerport=yyy > Im eigentlichen Programm brauche ich dann keine Fallunterscheidung, da meine abgeleitete > Properties Klasse jeweils das passende Präfix vor den Namen der Property setzt. Warum nicht einfach zwei verschiedene Dateien, von denen je nach Wert der Umgebungsvariablen die passende geladen wird? Alternativ eine Bibliothek verwenden, die unterschiedliche Konfigurationsblöcke bzw. -hierarchien innerhalb einer Datei explizit unterstützt, z.B. https://github.com/lightbend/config Falls man doch lieber selber basteln will: Das Design der Properties-Klasse ist eh schon fritte, alleine dadurch, dass sie von Hashtable ableitet. Wenn man nur #getProperty() überschreibt, macht man sich recht sicher irgendwo den Contract noch weiter kaputt - zusätzlich zu klassischen Problemen beim Ableiten von konkreten Klassen wie im OP. Besser also eine Wrapperklasse mit einer minimalen API, die auf die konkreten Anforderungen zugeschnitten ist, wie von Michael vorgeschlagen. Grundsätzlich sowieso: Favor composition over inheritance. [1] Viele Grüße Patrick [1] https://en.wikipedia.org/wiki/Composition_over_inheritance