UPPER-CASE में "स्थिर अंतिम लकड़हारा" घोषित किया जाना चाहिए?


243

जावा में, स्थिर अंतिम चर स्थिरांक हैं और सम्मेलन यह है कि उन्हें ऊपरी स्थिति में होना चाहिए। हालांकि, मैंने देखा है कि ज्यादातर लोग लॉगर को लोअर-केस में घोषित करते हैं जो पीएमडी में उल्लंघन के रूप में सामने आता है ।

उदाहरण के लिए:

private static final Logger logger = Logger.getLogger(MyClass.class);

बस "स्थिर अंतिम लकड़हारा" के लिए Google या SO खोजें और आप इसे अपने लिए देखेंगे।

क्या हमें इसके बजाय LOGGER का उपयोग करना चाहिए?


पीएमडी या चेकस्टाइल पठनीयता बढ़ाने के लिए पूर्व-परिपक्व भोले प्रयास हैं लेकिन वे लाभ की तुलना में अधिक नुकसान पहुंचाते हैं। एक सबसे पठनीय शैली संदर्भ के आधार पर मामले को बदल सकती है। अमरूद, या JDK src देखें, वे किसी भी सख्त शैली टेम्पलेट का पालन नहीं करते हैं, लेकिन पेशेवरों द्वारा बनाया गया यह निर्विवाद है। उदाहरण: DelegatedExecutorService @ docjar.com/html/api/java/util/concurrent/Executors.java.html
Daniel Hári

सोनार नियम ( rules.sonarsource.com/java/tag/conference/RSPEC-1312 ) के पास भी यह हैprivate static final Logger LOGGER = LoggerFactory.getLogger(Foo.class);
केनस्टन चोई

जवाबों:


306

लकड़हारा संदर्भ एक स्थिर नहीं है, लेकिन एक अंतिम संदर्भ है, और अपरकेस में नहीं होना चाहिए। एक निरंतर मान अपरकेस में होना चाहिए।

private static final Logger logger = Logger.getLogger(MyClass.class);

private static final double MY_CONSTANT = 0.0;

42
स्थिर अंतिम संदर्भ स्थिरांक हैं यदि वे अपरिवर्तनीय हैं। इस तर्क से, आपके पास लगातार तार नहीं होंगे क्योंकि कोई भी स्थिर अंतिम स्ट्रिंग एक संदर्भ है।
जेफरी बट्टमैन

30
लेकिन java.lang.String है वैसे भी अपरिवर्तनीय और वर्ग की एक विशेष प्रकार का (String.intern (), आदि सिरिंग पूल के बारे में दस्तावेज़ देखें)
एलेक्ज़ैंडर Adamowski

3
अपरिवर्तनीय का अर्थ है कि निर्माण के बाद वस्तु की स्थिति नहीं बदल सकती है। नीचे मेरी पोस्ट देखें। लकड़हारे जरूरी नहीं कि आपस में जुड़े हों।
जेफरी ब्लाटमैन

4
यदि कोई व्यक्ति अभी भी इस समस्या के बारे में परवाह करता है, तो कृपया यह जानने के लिए कि ऊपरी मामले की मांग कहां है और कहां नहीं है, भेद करने के लिए github.com/checkstyle/checkstyle/issues/23 पर विचार साझा करें ।
रोमन इवानोव

2
@ मुझे नहीं लगता कि अपरिवर्तनीयता इस बात से चिंतित है कि राज्य कैसे बदलता है, केवल वही करता है। इसके अलावा, उपयोगकर्ता क्या है? बाहरी उपयोगकर्ता प्रोग्राम चला रहा है? क्या आप एक बटन दबाने वाले उपयोगकर्ता द्वारा संशोधित किए जा रहे राज्य के बीच एक अंतर करेंगे, और इसे कुछ यादृच्छिक अंतराल पर टाइमर फायरिंग द्वारा संशोधित किया जा रहा है? (मुझे ऐसा नहीं लगता)।
जेफरी ब्लाटमैन 20

236

क्रंचडॉग के उत्तर में अधिक मूल्य जोड़ने के लिए, जावा कोडिंग स्टाइल गाइड पैराग्राफ 3.3 फील्ड नामकरण में यह बताता है

अचर के रूप में उपयोग किए जा रहे खेतों के नाम सभी ऊपरी मामले होने चाहिए, जिसमें अंडरस्कोर अलग-अलग शब्द होंगे। निम्नलिखित को स्थिरांक माना जाता है:

  1. सभी static finalआदिम प्रकार (याद रखें कि सभी इंटरफ़ेस फ़ील्ड स्वाभाविक रूप से हैं static final)।
  2. सभी static finalऑब्जेक्ट संदर्भ प्रकार जो कभी भी " ." (डॉट) द्वारा अनुसरण नहीं किए जाते हैं ।
  3. सभी static finalसरणियाँ जिनका अनुसरण कभी नहीं किया जाता है " [" (वर्ग ब्रैकेट खोलते हुए)।

उदाहरण:

MIN_VALUE, MAX_BUFFER_SIZE, OPTIONS_FILE_NAME

इस सम्मेलन के बाद, loggerएक है static finalवस्तु संदर्भ के रूप में बिंदु 2 में कहा गया है, लेकिन क्योंकि यह है द्वारा "इसके बाद .हर आप इसका इस्तेमाल", यह एक निरंतर के रूप में नहीं माना जा सकता है और इस तरह छोटे अक्षर में होना चाहिए।


11
सबसे अच्छी परिभाषा जो मैंने अभी तक इसके लिए देखी है। लिंक किए गए दस्तावेज़ को यहाँ अद्यतन cs.bilgi.edu.tr/pages/standards_project/…
robert

15
मुझे बिंदु 2 नहीं मिलता है। एक वस्तु प्रकार का एक उदाहरण है जिसे डॉट के बाद कभी नहीं देखा जाता है। सभी ऑब्जेक्ट प्रकार इनहेरिट करते हैं Objectऔर आप एक विधि कह सकते हैं जैसे कि .equalsउन पर।
dogbane

6
तुम सही हो। और जब Boolean.TRUE, Boolean.FALSE, TimeUnit.MINUTES, String.CASE_INSENSITIVE_ORDER या संग्रह .EMPTY_LIST जैसे कुछ जावा स्थिरांक को देखते हैं, तो उनका अनुसरण भी किया जा सकता है .
cbliard

5
@RomanIvanov मैंने इसे फिर से यहां पाया: scribd.com/doc/15884743/Java-Coding-Style-by-Achut-Rutdy अच्युत रेड्डी द्वारा लिखित, अंतिम अपडेट 30 मई, 2000
सीब्लीअर्ड

1
मेरा मानना ​​है कि 2 का उद्देश्य यह है कि केवल उन वर्गों को नामित किया जाए जो तुलनात्मक रूप से स्थिर हैं। क्लास का मतलब 'इस्तेमाल' करना नहीं है। मुझे पता है कि जब मैं SOME_CLASS.doStuff () देखता हूं तो मैं हमेशा संकट में रहता हूं। यह केवल बहुत कोडिंग है। इसके साथ एकमात्र समस्या एक स्थिर वस्तु के सामान्य मामले में है (स्ट्रिंग सामान्य उदाहरण है) जो केवल तुलना के लिए है, लेकिन अशक्त जांच से बचने के लिए, योडा स्टाइल कोडिंग का उपयोग किया जाता है और इस प्रकार बराबर () को स्थिरांक पर बुलाया जाता है। मुझे लगता है कि मैं इसे एक कैविएट बना दूंगा 2.
रॉबिन

44

प्रभावी जावा से, दूसरा संस्करण।

पिछले नियम का एकमात्र अपवाद "निरंतर क्षेत्र" की चिंता है, जिनके नाम में अंडरस्कोर वर्ण द्वारा अलग किए गए एक या अधिक अपरकेस शब्द शामिल होने चाहिए, उदाहरण के लिए, VALUES या NEGATIVE_INFINITY। एक स्थिर फ़ील्ड एक स्थिर अंतिम फ़ील्ड है जिसका मान अपरिवर्तनीय है । यदि एक स्थिर अंतिम क्षेत्र में एक आदिम प्रकार या एक अपरिवर्तनीय संदर्भ प्रकार (आइटम 15) है, तो यह एक स्थिर क्षेत्र है। उदाहरण के लिए, एनम स्थिरांक निरंतर क्षेत्र हैं। यदि किसी स्थिर अंतिम फ़ील्ड में एक परिवर्तनशील संदर्भ प्रकार होता है, तो यह अभी भी एक स्थिर फ़ील्ड हो सकता है यदि संदर्भित ऑब्जेक्ट अपरिवर्तनीय है।

सारांश में, स्थिर == स्थिर अंतिम, प्लस यदि यह एक संदर्भ (बनाम एक साधारण प्रकार) है, तो अपरिवर्तनीयता।

Slf4j लकड़हारे को देखते हुए, http://www.slf4j.org/api/org/slf4j/Logger.html

यह अपरिवर्तनीय है। दूसरी ओर, JUL लकड़हारा उत्परिवर्तनीय है। Log4j लकड़हारा भी परिवर्तनशील है। तो सही होने के लिए, यदि आप log4j या JUL का उपयोग कर रहे हैं, तो यह "logger" होना चाहिए, और यदि आप slf4j का उपयोग कर रहे हैं, तो यह LOGGER होना चाहिए।

ध्यान दें कि ऊपर दिए गए slf4j javadocs पृष्ठ में एक उदाहरण है जहां वे "लकड़हारा" का उपयोग करते हैं, न कि "LOGGER" का।

ये निश्चित रूप से केवल कन्वेंशन हैं और नियम नहीं हैं। यदि आप slf4j का उपयोग कर रहे हैं और आप "लकड़हारा" का उपयोग करना चाहते हैं, क्योंकि आप अन्य चौखटे से उपयोग किए जाते हैं, या यदि यह टाइप करना आसान है, या पठनीयता के लिए, आगे बढ़ें।


2
इस तर्क के आधार पर फिर चेकस्टाइल की सरलीकृत परिभाषा अनुचित है?
रॉबर्ट

3
मुझे पता नहीं है कि स्टाइल के नियम क्या हैं। यदि यह केवल इस बात पर जोर दे रहा है कि किसी भी स्थिर फाइनल को ऊपरी मामला होना चाहिए, तो हाँ, यह गलत है।
जेफरी ब्लाटमैन

5
Logger इंटरफ़ेस वास्तव में अपरिवर्तनीय कैसे है ? केवल final class(जैसे Stringया Integer) अपरिवर्तनीयता की गारंटी दे सकता है। यहां तक ​​कि अगर आप SLF4J के किसी भी परिवर्तनशील कार्यान्वयन को नहीं पा सकते हैं Logger, तो कोई भी आपको खुद को लिखने से रोक नहीं सकता है।
कोस्टी सियुडैटू

क्योंकि इंटरफ़ेस की विधियाँ स्वाभाविक रूप से उत्परिवर्तन की अनुमति नहीं देती हैं। आप सही हैं, हालांकि आप परस्पर प्रभाव के लिए इंटरफ़ेस लागू कर सकते हैं।
जेफरी ब्लाटमैन

पठनीयता को फँसाने के लिए जाँच शैली नियम पर्याप्त नहीं हैं। पठनीयता एक शैली को गति देकर हासिल नहीं की जा सकती, पठनीयता मामले को संदर्भ के आधार पर अलग कर सकती है। JDK कोड देखें, यह किसी भी शैली टेम्पलेट का पालन नहीं करता है, और पेशेवरों द्वारा बनाया गया है, जो कुछ दिखाता है।
डैनियल हैरी

37

मुझे इस पर Google की पसंद है ( Google जावा स्टाइल )

हर स्थिरांक एक स्थिर अंतिम क्षेत्र है, लेकिन सभी स्थैतिक अंतिम क्षेत्र स्थिरांक नहीं हैं। निरंतर मामला चुनने से पहले, विचार करें कि क्या क्षेत्र वास्तव में एक स्थिरांक जैसा लगता है। उदाहरण के लिए, यदि उस उदाहरण की कोई भी अवलोकन स्थिति बदल सकती है, तो यह लगभग निश्चित रूप से स्थिर नहीं है। आमतौर पर वस्तु को कभी नहीं बदलने का इरादा आमतौर पर पर्याप्त नहीं होता है।

उदाहरण:

// Constants
static final int NUMBER = 5;
static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");
static final Joiner COMMA_JOINER = Joiner.on(',');  // because Joiner is immutable
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT }

// Not constants
static String nonFinal = "non-final";
final String nonStatic = "non-static";
static final Set<String> mutableCollection = new HashSet<String>();
static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};

6
मुझे लगता है कि पहला वाक्य यह संक्षेप में कहता है: "हर स्थिर एक स्थिर अंतिम क्षेत्र है, लेकिन सभी स्थिर अंतिम क्षेत्र स्थिर नहीं हैं।" यांत्रिक सोच का उपयोग करना आसान है और बस अपरकेस में प्रत्येक स्थिर अंतिम क्षेत्र है (और मैं अब तक ऐसा कर रहा हूं) लेकिन यह भाषा की सूक्ष्मता को याद करना है।
अयाहुस्का १०

उस बोली के अनुसार, यह उबलता है यदि क्षेत्र "वास्तव में एक स्थिर की तरह" महसूस करता है। हम इंजीनियर हैं, मनोचिकित्सक नहीं।
जेफरी बट्टमैन

"विचार करें ... अगर यह वास्तव में एक स्थिर की तरह लगता है"। किसी की भावनाओं को वास्तव में इंजीनियरिंग के क्षेत्र में प्रवेश नहीं करना चाहिए।
जेफरी बट्टमैन

फिर अमरूद के कोड में उनके पास यह हैprivate static final Logger logger = Logger.getLogger(Finalizer.class.getName());
केनस्टन चोई

10

यदि आप अपने कोडिंग मानकों की जांच के लिए एक स्वचालित उपकरण का उपयोग कर रहे हैं और यह उक्त मानकों का उल्लंघन करता है तो इसे या मानकों को तय किया जाना चाहिए। यदि आप बाहरी मानक का उपयोग कर रहे हैं, तो कोड को ठीक करें।

सन जावा में सम्मेलन सार्वजनिक स्थैतिक स्थिरांक के लिए अपरकेस है। स्पष्ट रूप से एक लकड़हारा स्थिर नहीं है, लेकिन एक परिवर्तनशील चीज का प्रतिनिधित्व करता है (अन्यथा इस बात पर कोई कॉल करने के तरीके नहीं होंगे इस उम्मीद में कि कुछ होगा); गैर-स्थिर अंतिम फ़ील्ड के लिए कोई विशिष्ट मानक नहीं है।


10
आप क्यों कह रहे हैं कि लकड़हारा स्थिर नहीं है? यह वास्तव में निरंतर लगता है। लॉगिंग का उत्पादन इसके तरीकों को कॉल करने का एक साइड-इफेक्ट है, लेकिन इसकी अवलोकनीय स्थिति को नहीं बदलते हैं। क्या मैं कुछ भुल गया?
केएलई

एपीआई की जाँच करें। इसमें विधियों की एक जोड़ी / जोड़ी है। लेकिन आप तर्क वैसे भी त्रुटिपूर्ण है। लॉगिंग अवलोकनीय है (अन्यथा, क्या बात है)।
टॉम हैटिन -

3
यदि यह एक लकड़हारे के बजाय एक स्ट्रिंगबर्ल थे, तो यह शायद अधिक स्पष्ट रूप से गैर-स्थिर होगा। यहां तक ​​कि लॉगर के लिए, लॉगर.सेट लेल () जैसे तरीके रिसीवर को नितांत निरीक्षण करते हैं। आम तौर पर अपरकेस उन स्थिरांक के लिए होता है जिन्हें भाषाएं स्थिरांक और विल इनलाइन मानती हैं।
पीट किरकम

5
लकड़हारा स्थिर नहीं है क्योंकि यह किसी वस्तु का संदर्भ है। लगातार ऐसे मान हैं जिन्हें बदला नहीं जा सकता। ऑब्जेक्ट संदर्भ अंतिम है (इसलिए इसका संदर्भ परिवर्तित नहीं किया जा सकता है, उदाहरण के लिए किसी अन्य चीज़ के साथ स्वैप किया गया है या शून्य पर सेट किया गया है) लेकिन ऑब्जेक्ट स्वयं कर सकते हैं।
स्पाइक

1
@JeffreyBlattman मैं इस बात से सहमत नहीं हूं कि सभी अंतिम संदर्भ ऊपरी मामला होना चाहिए, लेकिन आप जो भी कोडिंग मानकों को पसंद करते हैं उसे अपनाने के लिए स्वतंत्र हैं। मुझे खेद है कि आपको able उत्परिवर्तित वस्तु ’और a वस्तु’ के बीच का अंतर मालूम होता है, जो एक परिवर्तनशील वस्तु को दर्शाता है; एक उदाहरण आपका बैक अकाउंट नंबर हो सकता है, जो स्वयं नहीं बदलता है, लेकिन इसका उपयोग वैरिएबल बैलेंस तक पहुंचने के लिए किया जाता है। अधिक विवरण के लिए हस्ताक्षरकर्ता और महत्व के बीच अंतर के लिए देखें, या लिबनिट्ज के मोनड्स के लिए एक परिचय कि कैसे एक अपरिवर्तनीय चीज उत्परिवर्तन का प्रतिनिधित्व कर सकती है।
पीट किरकम

7

यदि आप इसे Google करते हैं, तो आप पा सकते हैं कि कुछ मामलों में, लॉगर्स को स्थिर फाइनल के रूप में परिभाषित नहीं किया गया है। इसमें कुछ क्विक कॉपी-एन-पेस्ट जोड़ें, और यह इसे समझा सकता है।

हम अपने सभी कोड में LOGGER का उपयोग करते हैं , और यह हमारे नामकरण सम्मेलन से मेल खाता है (और हमारा CheckStyle इससे खुश है)।


हम और भी आगे बढ़ते हैं, ग्रहण में सख्त नामकरण सम्मेलन का लाभ उठाते हुए। हम एक कोड टेम्पलेट के साथ एक नया वर्ग बनाते हैं:

    // private static final Logger LOGGER = Logger.getLogger(${enclosing_type}.class);

लकड़हारा बाहर टिप्पणी की है, शुरू में हम इसकी जरूरत नहीं है। लेकिन क्या हमें बाद में इसकी आवश्यकता है, हम इसे अनसुना कर देते हैं।

फिर कोड में, हम कोड टेम्प्लेट का उपयोग करते हैं जो उम्मीद करते हैं कि यह लकड़हारा मौजूद होगा। उदाहरण के लिए आज़माएं:

    try {
      ${cursor} or some other template
    } catch (Exception t) {
      LOGGER.error("${methodName} ${method parameters}", t);
    }

हमारे पास कुछ और टेम्पलेट हैं जो इसका उपयोग करते हैं।

सख्त सम्मेलन हमें और अधिक उत्पादक और कोड टेम्पलेट्स के साथ सुसंगत होने की अनुमति


5
थ्रोबल को पकड़ना बुरा अभ्यास है, जब तक कि आप लॉग नहीं करते हैं और इसे रीथ्रो करते हैं। एरर्स याद रखें: आउटऑफमेमोरीऑर्र, आदि ईवेंट एक्सेप्शन मल्टी-थ्रेड एप्लिकेशन में स्वयं को पकड़ने और संभालने के लिए सुरक्षित नहीं है।
m_vitaly

2
ग्रहण वाक्य रचना है: Logger.getLogger ($ {enclosing_type} .class);
डॉगबेन

@fahdshariff सटीक वाक्यविन्यास के लिए धन्यवाद। मैंने अपना उत्तर अपडेट कर दिया।
केएलई

यदि चेकस्ली या पीएमडी के "सख्त सम्मेलनों" में मदद मिलती है, तो अमरूद, और जेडडीके स्रोतों में कोई भी सामान्य शैली क्यों नहीं है? उदाहरण के लिए उनके स्रोत में भरपूर मात्रा में पूर्ण ब्लॉक हैं जहां जरूरत है। पठनीयता संदर्भ निर्भर है, इसलिए हर चीज के लिए सख्त स्टाइल सम्मेलनों का उपयोग करना संदर्भ आधारित निर्णयों को नष्ट कर देता है, इसलिए पठनीयता घट जाती है।
डैनियल हैरी

6

मुझे व्यक्तिगत रूप से लगता है कि ऊपरी मामले में यह वास्तव में बड़ा दिखता है। इसके अलावा, चूंकि यह एक वर्ग है जो सीधे तौर पर वर्ग व्यवहार से संबंधित नहीं है, इसलिए मुझे loggerइसके बजाय उपयोग करने में एक बड़ी समस्या नहीं दिखती है LOGGER। लेकिन अगर आप सख्ती से पांडित्य करने जा रहे हैं, तो उपयोग करें LOGGER


4

यह मत भूलो कि पीएमडी के साथ एक टिप्पणी का सम्मान करेंगे

// NOPMD

इस में। यह पीएमडी को इसके चेक से लाइन को छोड़ने का कारण बनेगा, इससे आप अपनी मनचाही शैली को चुन सकेंगे।


6
या पीएमडी का उपयोग न करें, वे हमेशा गलत होते हैं और आपका कोड एकदम सही है
IAdapter

1
यदि आपको हर बार चेक को बाहर करने की आवश्यकता होती है, तो चेक का कोई मतलब नहीं है।
किकि

अधिक सहमत नहीं हो सकता है - हालांकि ... बहिष्करण टिप्पणी जानने के लिए इसका उपयोगी
Fortyrunner

3

आमतौर पर स्थिरांक अपरकेस में होते हैं।

लकड़हारा, हालांकि, स्थिर नहीं होना चाहिए, लेकिन अगर slf4j मुखौटा का उपयोग कर वर्ग के हर "नए" के लिए देखा। यह विशेष रूप से वेब कंटेनरों में कुछ खराब क्लास लोडर मुद्दों से बचा जाता है, साथ ही यह लॉगर फ्रेमवर्क को अदृश्य संदर्भ के आधार पर विशेष सामान करने की अनुमति देता है।


2

मैं 'लकड़हारा', यानी निचला मामला पसंद करता हूं। इसका कारण यह नहीं है कि यह एक स्थिरांक है या एक स्थिर (परस्पर या अपरिवर्तनीय) नहीं है। यदि हम उस तर्क का उपयोग करते हैं, तो हमें चर का नाम बदलना होगा यदि हम लॉगिंग फ्रेमवर्क को बदलते हैं (या यदि फ्रेमवर्क लॉगर्स की परिवर्तनशीलता को बदल देता है)।

मेरे लिए, अन्य कारण अधिक महत्वपूर्ण हैं।

  1. एक लकड़हारा वर्ग में एक छाया वस्तु है और इसे बहुत प्रमुख नहीं होना चाहिए क्योंकि यह मुख्य तर्क को लागू नहीं करता है। यदि हम 'LOGGER' का उपयोग करते हैं, तो यह कोड में एक आंख को पकड़ने वाला है जो बहुत अधिक ध्यान आकर्षित करता है।

  2. कभी-कभी लॉगर्स को उदाहरण के स्तर पर घोषित किया जाता है (जैसे कि स्थिर नहीं), और यहां तक ​​कि एक निर्भरता के रूप में इंजेक्शन भी। यदि मैं लकड़हारा प्राप्त करने के तरीके को बदलने का फैसला करता हूं तो मैं अपना कोड बदलना नहीं चाहूंगा। कोड स्थिरता wrt। यह (कई मामलों में काल्पनिक) परिवर्तन अन्य कारण है कि मैं निचले मामले को पसंद करता हूं।


1

यदि आपके कोडिंग मानक - यदि आपके पास कोई है - तो कहें कि यह अपरकेस होना चाहिए, फिर हाँ।

मैं किसी भी तरह से या किसी अन्य के लिए कोई कठोर कारण नहीं देखता हूं। मुझे लगता है कि यह पूरी तरह से आपकी व्यक्तिगत पसंद पर निर्भर करता है। आपकी कंपनी कोडिंग मानकों।

BTW: मैं "लोगो" ;-) पसंद करते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.