Path: csiph.com!newsfeed.xs4all.nl!newsfeed9.news.xs4all.nl!85.12.16.68.MISMATCH!peer01.ams1!peer.ams1.xlned.com!news.xlned.com!newsreader4.netcologne.de!news.netcologne.de!.POSTED.2001-4dd4-3e7b-0-e12b-774c-9bfe-8880.ipv6dyn.netcologne.de!not-for-mail From: Patrick Roemer Newsgroups: de.comp.lang.java Subject: Re: Strategy-Objekte Date: Fri, 3 May 2019 10:58:34 +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: Fri, 3 May 2019 08:58:34 -0000 (UTC) Injection-Info: newsreader4.netcologne.de; posting-host="2001-4dd4-3e7b-0-e12b-774c-9bfe-8880.ipv6dyn.netcologne.de:2001:4dd4:3e7b:0:e12b:774c:9bfe:8880"; logging-data="8446"; 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 X-Received-Bytes: 3052 X-Received-Body-CRC: 3389265554 Xref: csiph.com de.comp.lang.java:13245 Responding to Christian H. Kuhn: > Das riecht nach dem Strategy Pattern. Also etwa > > interface ResultToScore { > public float score(Chessresult result); > } > > Die einzelnen Strategien möchte ich als nicht-anonyme Klasse definieren. > Eine Lambda-Expression an geeigneter Stelle liest sich elegant, ist aber > nicht wiederverwendbar. Egal, wo ich lese, ist die Implementation sowas wie > > public class OnePoint implements ResultToScore { > @Override > public float score(Chessresult result) { > switch (result) { > case Chessresult.WIN: return 1; > case Chessresult.DRAW: return 0.5; > case Chessresult.LOSS: > default: return 0; > } > } > } > > Ich brauche aber gar kein Objekt, es würde mir reichen, wenn score() > static wäre. Wenn ich ein Objekt nehme, reicht mir ein Singleton. Und > überhaupt haben alle diese Strategien keinen Zustand und sind > automatisch immutable. Gibt es einen Grund, warum in allen Beispielen, > die ich finde, die Strategy-Klassen so implementiert werden, dass es von > jeder verschiedene unterscheidbare Instanzen gibt, obwohl das auch in > den meisten Beispielen sinnlos ist? Oder mache ich mir zuviel Gedanken? Irgendwie schon. Die einfache Klasse dürfte dem Tutorial-Autor schlicht didaktisch intuitiver vorkommen als ein Mix von Strategy und Singleton. In "richtigem" Code hätte ich wohl eine leichte Präferenz für die Singleton-Variante - mehr Boilerplate, aber saubere Objektidentität. In Scala hingegen gibt es Singletons als Sprachkonstrukt, da hat man diesen Tradeoff nicht: type ResultToScore = Chessresult => Float object OnePoint extends ResultToScore { override def apply(result: Chessresult): Float = result match { case Chessresult.WIN => 1 case Chessresult.DRAW => 0.5F case Chessresult.LOSS => 0 } } println(OnePoint(Chessresult.WIN)) Viele Grüße Patrick