Frage

Ich habe einen relativ komplizierten generischen Typen (etwa Map<Long,Map<Integer,String>>), die ich intern in einer Klasse. (Es gibt keine externe Sichtbarkeit;., Es ist nur eine Implementierung Detail). Ich möchte dies in einem typedef verstecken, aber Java hat keine solche Einrichtung

Gestern entdeckte ich folgende Idiom und war enttäuscht zu erfahren, dass es

Andere Tipps

IMO, das Problem mit Java anti-Muster ist, dass sie Schwarz-Weiß-Denken zu fördern.

In der Realität sind die meisten anti-Muster sind nuanciert. Zum Beispiel erklären die verlinkten Artikel, wie pseudo-typedefs zu APIs führt, dessen Typ Signaturen ist zu restriktiv, auch gebunden an bestimmte Implementierung Entscheidungen, viral, und so weiter. Aber das ist alles im Zusammenhang mit der öffentlichen APIs. Wenn Sie pseudo-typedefs aus öffentlichen APIs halten (das heißt sie auf eine Klasse, oder vielleicht ein Modul), tun sie wahrscheinlich keinen wirklichen Schaden und sie können Ihr Code besser lesbar.

Mein Punkt ist, dass Sie auf verstehen , um das anti-Muster und macht ein begründetes Urteil , wann und wo sie zu vermeiden. Einfach den Standpunkt, dass „ich will nie tut X, weil es ein Anti-Muster“ bedeutet, dass Sie manchmal aus akzeptabel herrschen, oder sogar guten Lösungen.

Für öffentliche Schnittstellen Ich mag keine generischen Typen sehen, weil sie keine Bedeutung hat. Für mich eine Methode mit einem Argument von HashMap > ist ähnlich wie jene C-Methoden wie foo sehen (int, int, int, void *, int) und so weiter. nur eine echte Art zu haben, macht Code zu lesen viel einfacher. Für eine öffentliche Schnittstelle wäre es besser, FooBarMap zu schaffen, die HashMap > anstatt hüllt ‚typedef‘, aber für Klasse-internen Gebrauch sehe ich keine Down-Seite überhaupt.

Ohne diesen pseudo-typedef würde ich lieber schreiben

private Map<Long,Map<Integer,String>>[] maps;

und wenn ich eines Tages die implementierende Klasse von HashMap entscheiden, ändern sich TreeMap oder Java7GreatEnhancedWonderfulMap :-) nichts brechen. Aber mit diesem, sind Sie mit der HashMap stecken. Nun, können Sie machen:

interface FooBarMap extends Map<Long,Map<Integer,String>> { };
class FooBarHashMap extends HashMap<Long,Map<Integer,String>> implements FooBarMap{ };

, aber es wird mehr und mehr umständlich.

Er hat einen guten Punkt, um diese Option, wenn es darum geht es in einer öffentlichen Schnittstelle zu setzen. Dieses Idiom ist eine Form der syntaktischen Zucker emuliert, sollte es nicht beeinflussen, was Sie Ihren Kunden zeigen.

Aber ich sehe keinen guten Grund, nicht lokal verwendet wird, vorausgesetzt, es macht Ihnen das Leben leichter und Code besser lesbar - und Sie bekannt, was Sie tun. Brian kann stark dagegen in jeder Situation verallgemeinern und beraten, aber das ist sein Goetz Gefühl: p

Wenn Sie nur in einer kleinen lokalisierten Einheit von Code verwenden, die Probleme sind klein, wahr.

Das Ding ist, so sind die Gewinne: Ihr Programm wird wahrscheinlich nicht einmal textlich immer kleiner, bis Sie die pseudo-typedef 5+ Zeiten verweisen, die den Bereich bedeutet es sichtbar ist in hat nicht-trivial sein

Ich würde wahrscheinlich nicht Code neu schreiben, der das getan hat, aber es scheint eine schlechte Gewohnheit, in zu erhalten.

scroll top