2009-09-29 19 views
27

वीबी.नेट में वीओएमईटी है जिसमें आपको ऑब्जेक्ट नाम छोड़ने और केवल आवश्यक विधियों और गुणों तक पहुंचने की सुविधा मिलती है। उदाहरण के लिए:जावा में कथन के साथ

With foo 
    .bar() 
    .reset(true) 
    myVar = .getName() 
End With 

क्या जावा के भीतर ऐसा कोई वाक्यविन्यास है?

धन्यवाद!

+1

सभी प्रतिक्रियाओं के लिए धन्यवाद। मुझे पूरा यकीन था कि ऐसा कोई वाक्यविन्यास नहीं था। विभिन्न स्थितियों के लिए बहुत सारे महान सुझाव। –

उत्तर

30

संख्या सबसे अच्छा तुम कर सकते हो, जब अभिव्यक्ति ज्यादा लंबा है, एक संक्षिप्त नाम के साथ एक स्थानीय चर निर्दिष्ट करने के लिए है, और {...} का उपयोग एक गुंजाइश बनाने के लिए:

{ 
    TypeOfFoo it = foo; // foo could be any lengthy expression 
    it.bar(); 
    it.reset(true); 
    myvar = it.getName(); 
} 
+2

वीबी की मेरी समझ बहुत अच्छी नहीं है, लेकिन मुझे नहीं लगता कि यह ऐसा कर रहा है। –

+0

(समतुल्य जावा 'foo.bar(); foo.reset (true) होगा; स्ट्रिंग myVar = foo.getName(); '।) –

+0

यह होगा, लेकिन यह बिल्कुल करने के लिए बहुत कुछ नहीं करता है जब आपके पास पहले से ही 'foo' जैसे चर हो, तो यही कारण है कि मैंने एक और जटिल अभिव्यक्ति को शामिल करने के लिए उदाहरण बदल दिया। वीबी में भी, 'साथ' का प्रयोग अक्सर लंबे अभिव्यक्तियों के साथ किया जाता है। इसके अलावा, 'myVar' घोषित करने की कोई आवश्यकता नहीं है - संभवतः यह बाहरी दायरे में पहले ही घोषित कर दी गई है। यद्यपि 'सही' को सही करने की आवश्यकता है, इसे इंगित करने के लिए धन्यवाद। –

3

नहीं। जावा में ऐसी किसी भी चीज़ से बचने की नीति है जो शब्दकोष को कम कर सकती है।

ठीक है, यह लिखने के बाद यह हुआ कि यह निकटतम बात स्थिर आयात हो सकती है, उदाहरण के लिए

package a.b.c.d; 
public class Foo { 
    public static void bar() { 
     ... 
    } 
} 

और अब आप कर सकते हैं

package d.e.f; 
import static a.b.c.d.Foo.*; 

bar(); 
+0

वर्बोज़? मुझे लगता है कि जब वे सशर्त ऑपरेटर (? :) बनाते हैं तो वे गड़बड़ हो जाते हैं। वीबी जावा की तुलना में अधिक वर्बोज़ होता है। –

+0

"नहीं। जावा में ऐसी किसी भी चीज़ से परहेज करने की नीति है जो शब्दकोष को कम कर सकती है।" - हास्य फेंकने के रूप में मजाकिया। –

3

निकटतम बात यह करने के लिए स्थिर आयात आपने अभी तक स्पष्ट वर्ग जिस पर विधि मौजूद है निर्दिष्ट किए बिना स्थिर तरीकों कॉल करने के लिए अनुमति देगा।

15

शायद जावा में ऐसा करने का सबसे नज़दीकी तरीका निर्माण के दौरान डबल ब्रेस मुहावरे है।

Foo foo = new Foo() {{ 
    bar(); 
    reset(true); 
    myVar = getName(); // Note though outer local variables must be final. 
}}; 

वैकल्पिक रूप से, तरीकों कि वापसी this श्रृंखलित जा सकता है:

myName = 
    foo 
     .bar() 
     .reset(true) 
     .getName(); 

जहां bar और reset तरीकों लौट this

हालांकि, ऐसा करने के लिए यह इंगित करना है कि वस्तु में पर्याप्त व्यवहार नहीं है। बुलाया वर्ग में refactoring का प्रयास करें। शायद बाहर निकलने की कोशिश कर रहे एक से अधिक वर्ग हैं।

+6

मैं यह बताता हूं कि यह कैसे काम करता है: "केवल डबल सिग्नलिक चीनी" नहीं है। यह एक अज्ञात सबक्लास है जिसमें इसके अंदर एक इंस्टॉलेशन प्रारंभकर्ता ब्लॉक है। इसका मतलब है कि इसका हर उपयोग जार में कोड और स्मृति में अतिरिक्त कक्षा के साथ ब्लाउट करता है और इसका मतलब है कि बनाई गई वस्तु का रन-टाइम क्लास नामित वर्ग का उप-वर्ग है। – Boann

+2

कोई भी जो पहले "मुहावरे" का उपयोग करता है वह कुछ कम करने के लिए पठनीयता और डिजाइन का त्याग कर रहा है। यदि वर्ग को चेनिंग के लिए डिज़ाइन किया गया था तो निश्चित रूप से इसका उपयोग किया जा सकता है (लेकिन मैं उन उत्तरों को अलग से कम नहीं कर सकता)। –

6

कुछ ऑब्जेक्ट्स आपको "चेन" विधि आमंत्रण की अनुमति देती हैं, जो आपके पसंदीदा वाक्यविन्यास तक पहुंचती है। उदाहरण के लिए, अक्सर एक बिल्डर वर्ग तरीकों से खुद को लौट ताकि आप कुछ इस तरह कर सकते हैं होगा:

MyObject b = new MyBuilder().setFoo(5).setBar(6).setBaz("garply!").build(); 

प्रत्येक set... विधि रिटर्न this ताकि आप अगले मंगलाचरण श्रृंखला कर सकते हैं।

8

आप स्थानीय चर को संशोधित करने में सक्षम नहीं होने के कारण जावा 8 लैम्बडास का उपयोग करके काफी करीब आ सकते हैं।

प्रचार इस विधि:

static <T> void with(T obj, Consumer<T> c) { 
    c.accept(obj); 
} 

तो आप का उपयोग कर सकते हैं:

Window fooBarWindow = new Window(null); 

String mcHammer = "Can't Touch This"; 

with(fooBarWindow, w -> { 
    w.setAlwaysOnTop(true); 
    w.setBackground(Color.yellow); 
    w.setLocation(300, 300); 

    w.setTitle(mcHammer); // can read local variables 
    //mcHammer = "Stop!"; // won't compile - can't modify local variables 
}); 

यह भी संभव एक अनाम वर्ग का उपयोग कर रहा है, लेकिन के रूप में साफ नहीं।

+2

वर्तमान कंपाइलर्स और वीएम पर यह ब्लॉक के लिए एक अज्ञात वर्ग लोड करेगा, और जब भी ब्लॉक चलता है इसे तुरंत चालू करें। व्यक्तिगत रूप से मुझे वह हेवीवेट लगता है, जब @ पावेलमिनेव के सुझाव की आवश्यकता नहीं होती है। हालांकि यह एक दिलचस्प और चालाक विचार है। – Boann

2

जैसा कि पहले से ही कहा गया है, आप वास्तव में जावा में इस कोड को नहीं लिख सकते हैं।

बस एक टिप्पणी, अगर आप मामले आप चर नाम बदलने की जरूरत में कई कॉपी/पेस्ट की affraid कर रहे हैं, आप स्वचालित रूप से ग्रहण चर के सभी संदर्भों का नाम बदलने के लिए अनुमति देता है के रूप में:

एएलटी का उपयोग करना + शिफ्ट + "foo" चर नाम पर आर, आप सभी को एक बार "myFoo" करने के लिए उदाहरण के लिए नाम बदल सकते हैं:

Foo myFoo = new Foo(); 
myFoo.bar(); 
myFoo.reset(true); 
संबंधित मुद्दे