मुझे हाल ही में काम पर हमारे कोडबेस में यह छोटा मणि मिला। बस बुला MysteryEnum.values()
यह sun.misc.SharedSecret
बुलाया कुछ का उपयोग कर रहा है के बजायsun.misc. का उपयोग किया गया शेयर
package foo.bar;
import sun.misc.SharedSecrets;
import foo.baz.HasAGetValuesMethod;
public enum MysteryEnum implements HasAGetValuesMethod {
THINGY, BOB;
@Override
public MysteryEnum[] getValues() {
return SharedSecrets.getJavaLangAccess().getEnumConstantsShared(MysteryEnum .class);
}
}
getValues में() विधि: मैं कबूल करने के लिए मैं बिल्कुल पता नहीं क्यों इस enum इस तरह से लिखा गया था कि है (नाम मासूम की रक्षा करने के लिए बदल) sun.misc.JavaLangAccess
नामक किसी चीज़ को संभालने के लिए, फिर का उपयोग करके सभी enum मानों की सरणी प्राप्त करने के लिए। उस वर्ग पर जावाडोक आपको बताता है कि विधि क्या करती है, लेकिन मुझे पर पर अधिक नहीं मिल रहा है, आप इसे कॉल करना चाहते हैं।
डेवलपर जो इसे लिखता है अब नहीं है, इसलिए मैं उससे नहीं पूछ सकता। मैं वैसे भी अपनी टीम से पूछने जा रहा हूं, लेकिन मुझे एहसास है कि जवाब होगा: "यह नहीं पता कि यह ऐसा क्यों करता है, लेकिन इसे बेहतर नहीं बदलता"। इस पल के लिए, मुझे लगता है कि यह या तो यह जानने का कोई अजीब मामला है कि values()
विधि मौजूद है, या सूर्य की मेरी अज्ञानता। मिस्त्री पुस्तकालय मुझे दूसरों के लिए कुछ याद करने का कारण बन रहा है। कोई विचार यह है कि इस कोड को इस तरह क्यों लिखा गया था?
मैं देखता हूं। तो यह एक प्रदर्शन हैक है। इसके दिखने से, काफी भंगुर है। – Jon
पर्याप्त इसकी अस्पष्ट, 'सूर्य के नीचे। *', कि आप इसे से बचने या बड़ी सावधानी से संभाल करने के लिए पता होना चाहिए। 'Sun.misc.Unsafe' के समान;) –
के बारे में शिकार होने के बाद - यह मान() विधि वास्तव में संकलक द्वारा जोड़ा जाता है (यह Enum के लिए जावाडोक पर नहीं है) की तरह दिखता है। यदि ऐसा है, तो हम कैसे सुनिश्चित कर सकते हैं कि उपर्युक्त किसी भी तरह से अनुकूलित भी है? शायद संकलक को एक ही सरणी में एक हैंडल वापस करने के लिए अनुकूलित किया जाता है जहां मूल्य कहा जाता है? क्या यह जांचने का कोई तरीका है? – Jon