वहाँ एक सामान्य स्ट्रिंग प्रतिस्थापन समारोह sl4fj के समान है?


85

Sl4fj के साथ अगर मैं एक स्ट्रिंग संदेश का निर्माण करना चाहता हूं तो एक अच्छा तरीका है जो प्रतिस्थापन का उपयोग करता है। उदाहरण के लिए, यह कुछ इस तरह हो सकता है:

logger.info("Action {} occured on object {}.", objectA.getAction(), objectB);

यदि कुछ आवश्यक प्रतिस्थापन से अधिक हैं तो यह कुछ इस प्रकार है:

logger.info("Action {} occured on object {} with outcome {}.", 
    new Object[]{objectA.getAction(), objectB, outcome});

मेरा सवाल है: क्या मेरे लिए एक स्ट्रिंग बनाने के लिए एक सामान्य तरीका है (और न केवल एक slf4j लॉग संदेश)? कुछ इस तरह:

String str = someMethod("Action {} occured on object {}.", objectA.getAction(), objectB);

या

String str = someMethod("Action {} occured on object {} with outcome {}.", 
    new Object[]{objectA.getAction(), objectB, outcome});

यदि यह मानक जावा लाइब्रेरी में है, तो वह "someMethod" क्या होगा?


1
नीचे जवाब के साथ उन लोगों के लिए धन्यवाद। इसके अतिरिक्त, मुझे पता चला कि यह सवाल पहले ही यहां पूछा जा चुका था: stackoverflow.com/questions/3114021 । क्षमा करें, अधिक या कम डुप्लिकेट पोस्ट किया है।
किमी

जवाबों:


113

String.Format

String str = String.format("Action %s occured on object %s.",
   objectA.getAction(), objectB);

या

String str = String.format("Action %s occured on object %s with outcome %s.",
   new Object[]{objectA.getAction(), objectB, outcome});

आप संख्यात्मक पोजीशन का भी उपयोग कर सकते हैं, उदाहरण के लिए मापदंडों को चारों ओर स्विच करने के लिए:

String str = String.format("Action %2$s occured on object %1$s.",
   objectA.getAction(), objectB);

45

आप उपयोग कर सकते हैं String.Format या MessageFormat.format

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

MessageFormat.format("A sample value {1} with a sample string {0}", 
    new Object[] {"first", 1});

या केवल

MessageFormat.format("A sample value {1} with a sample string {0}", "first", 1);

1
MessageFormat बहुत बहुमुखी और शक्तिशाली है, लेकिन सरल प्रतिस्थापन के लिए, String.format संभवतः सरल और कम प्रतिबंधित होगा (उदाहरण के लिए, MessageFormat को सिंगल कोट्स को दोगुना करने की आवश्यकता होती है)।
कैट

1
नए इंटेगर (1) को केवल 1 से ऊपर के साथ बदल दिया गया, फिर भी काम करेगा।
टेक्नोक्रैट

25

यदि आप एक ऐसे समाधान की तलाश कर रहे हैं, जहां आप स्टर्लिंग के मानों के साथ चर का एक गुच्छा बदल सकते हैं, तो आप StrSubstitutor का उपयोग कर सकते हैं ।

 Map<String, String> valuesMap = new HashMap<>();
 valuesMap.put("animal", "quick brown fox");
 valuesMap.put("target", "lazy dog");
 String templateString = "The ${animal} jumped over the ${target}.";
 StrSubstitutor sub = new StrSubstitutor(valuesMap);
 String resolvedString = sub.replace(templateString);

यह आम तौर पर स्वीकृत पैटर्न का अनुसरण करता है, जहां एक नक्शा चर के साथ-साथ अनसुलझे स्ट्रिंग के साथ एक नक्शा पास कर सकता है और यह एक सुलझा हुआ स्ट्रिंग लौटाता है।


20

मैं org.slf4j.helpers.MessageFormatter का उपयोग करने का सुझाव दूंगा । इसकी मदद से कोई एक उपयोग विधि बना सकता है जो slf4j के समान सटीक स्वरूपण शैली का उपयोग करता है:

// utillity method to format like slf4j
public static String format(String msg, Object... objs) {
    return MessageFormatter.arrayFormat(msg, objs).getMessage();
}

// example usage
public static void main(String[] args) {
    String msg = format("This msg is {} like slf{}j would do. {}", "formatted", 4,
            new Exception("Not substituted into the message"));

    // prints "This msg is formatted like slf4j would do. {}"    
    System.out.println(msg); 
}

नोट : यदि सरणी में अंतिम ऑब्जेक्ट एक अपवाद है, तो यह संदेश में प्रतिस्थापित नहीं किया जाएगा, जैसे कि slf4j लकड़हारा। अपवाद के माध्यम से सुलभ होगा MessageFormatter.arrayFormat(msg, objs).getThrowable()


3
मेरा तर्क है कि यह एक अच्छा सामान्य-उद्देश्य वाला उत्तर नहीं है, लेकिन वास्तव में इस बात के लिए काफी है कि क्या पूछा गया था।
माइकल पिफेल

3
मुझे यह बिल्कुल सही जवाब लगता है। प्रदर्शन के मामले में यह सबसे अच्छा होना चाहिए।
ससा

1
सबसे अच्छा जवाब क्योंकि यह सटीक वाक्यविन्यास का उपयोग करता है जो सवाल पूछा गया है।
क्रिस्टोफ

स्पष्ट रूप से, IMHO यह एकमात्र उत्तर है जो वास्तव में मूल प्रश्न से मेल खाता है ... मुझे धड़कता है कि यह अभी चौथे स्थान पर क्यों है ...
रेनर

0

मैं Log4j2 ParameterizedMessage को लपेटता हूं, जो मूल रूप से जोर्न हक्सहॉर्न द्वारा लिलिथ के लिए लिखा गया था:

public static String format(final String messagePattern, Object... arguments) {
    return ParameterizedMessage.format(messagePattern, arguments);
}

यह SLF4J MessageFormatter के विपरीत संदेश प्रारूप पर ध्यान केंद्रित करता है, जिसमें Throwable का अनावश्यक प्रसंस्करण होता है।

जावदोक देखें:

उन संदेशों को हैंडल करता है जिनमें प्रत्येक बदली टोकन, और मापदंडों का प्रतिनिधित्व करने के लिए '{}' युक्त एक प्रारूप स्ट्रिंग होती है।

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