Verwendung von sun.misc.SharedSecrets

8

Ich habe dieses kleine Juwel in unserer Codebasis kürzlich bei der Arbeit gefunden. Ich muss gestehen, dass ich absolut keine Ahnung habe, warum dieses Enum so geschrieben wurde (Namen geändert, um die Unschuldigen zu schützen):

%Vor%

In der getValues ​​() -Methode, anstatt einfach MysteryEnum.values() aufzurufen, benutzt man etwas namens sun.misc.SharedSecret , um ein Handle für etwas namens sun.misc.JavaLangAccess zu erhalten, und dann das , um ein Array von allem zu erhalten die enum-Werte. Das Javadoc für diese Klasse sagt Ihnen, was die Methode macht, aber ich kann nicht viel zu finden, warum Sie es nennen möchten.

Der Entwickler, der das geschrieben hat, ist nicht mehr da, also kann ich ihn nicht fragen. Ich werde mein Team trotzdem fragen, aber ich habe das Gefühl, dass die Antwort lauten wird: "Ich weiß nicht, warum das so ist, aber ändern Sie es besser nicht". Im Moment nehme ich an, dass dies entweder ein merkwürdiger Fall von jemandem ist, der nicht weiß, dass die values() -Methode existiert, oder dass meine Unkenntnis der sun.misc-Bibliotheken mich dazu bringt, etwas Offensichtliches für andere zu verpassen. Irgendeine Idee, warum dieser Code so geschrieben wurde?

    
Jon 31.01.2012, 11:17
quelle

3 Antworten

7

Die Methode gibt das gleiche Array ohne Reflektion oder Kopieren / Klonen des zugrunde liegenden Arrays zurück. Dies verbessert die Leistung, aber es ist keine gute Idee, ein veränderbares Array verfügbar zu machen.

%Vor%

druckt

%Vor%

Anstatt diese Methode zu verwenden, verwende ich meine eigene zwischengespeicherte Kopie

%Vor%     
Peter Lawrey 31.01.2012, 12:27
quelle
3

Grundsätzlich SharedSecret :

  

Eine Sammlung von "shared secrets", die ein Mechanismus für       Aufruf von implementation-private Methoden in einem anderen Paket ohne       mit Reflexion.

Der Code gibt die Enum-Konstanten zurück, indem er die Klasse liest und die Konstanten zurückgibt (ohne Reflektionsaufrufe ausführen zu müssen). Dies ist so dynamisch, dass, wenn eine neue Enum-Konstante zur Enumeration hinzugefügt wird, die getValues() -Methode die hinzugefügten Enums zurückgibt (keine Notwendigkeit, den Code während der gesamten Show zu ändern).

    
Buhake Sindi 31.01.2012 11:33
quelle
1

Die Dokumentation lautet:

  

Gibt die Elemente einer Enum-Klasse oder NULL zurück, wenn das Klassenobjekt dies tut   nicht einen Enum-Typ darstellen; Das Ergebnis wird nicht geklont, zwischengespeichert und freigegeben   von allen Anrufern.

Also, es sei denn, der Punkt wäre, ein gemeinsam genutztes Array bereitzustellen, so dass jeder alles aufheben könnte, indem eines seiner Elemente auf null gesetzt oder sortiert wird oder was auch immer (was durch Zwischenspeichern des Ergebnisses von% co_de geschehen könnte) % Methode), meine Vermutung ist auch, dass diese Zeile wegen der Inkompetenz des vorherigen Entwicklers da ist.

Ich würde einen Komponententest schreiben, dann durch einen Aufruf von values() ersetzen und prüfen, ob der Komponententest noch besteht.

    
JB Nizet 31.01.2012 11:35
quelle

Tags und Links