C # में var कीवर्ड का एक उपयोग निहित प्रकार की घोषणा है। Var के लिए Java समकक्ष सिंटैक्स क्या है ?
C # में var कीवर्ड का एक उपयोग निहित प्रकार की घोषणा है। Var के लिए Java समकक्ष सिंटैक्स क्या है ?
जवाबों:
वहां कोई नहीं है। काश, आपको पूर्ण प्रकार का नाम लिखना होगा।
संपादित करें: पोस्ट किए जाने के 7 साल बाद, var
जावा 10 में स्थानीय चर (के साथ ) के लिए प्रकार जोड़ा गया।
संपादित करें: पोस्ट किए जाने के 6 साल बाद, नीचे से कुछ टिप्पणियां एकत्र करने के लिए:
C # का कारण var
कीवर्ड है, क्योंकि ऐसा करने के लिए संभव है कि टाइप करें जिनका .NET में कोई नाम नहीं है। उदाहरण के लिए:
var myData = new { a = 1, b = "2" };
इस मामले में, एक उचित प्रकार देना असंभव होगा myData
। 6 साल पहले, यह जावा में असंभव था (सभी प्रकार के नाम थे, भले ही वे बहुत ही क्रियात्मक और अनजान थे)। मुझे नहीं पता कि यह इस बीच बदल गया है या नहीं।
var
के रूप में ही नहीं है dynamic
। var
iables अभी भी 100% सांख्यिकीय रूप से टाइप किए गए हैं। यह संकलित नहीं होगा:
var myString = "foo";
myString = 3;
var
संदर्भ से प्रकार स्पष्ट होने पर भी उपयोगी है। उदाहरण के लिए:
var currentUser = User.GetCurrent();
मैं कह सकता हूं कि जिस भी कोड के लिए मैं जिम्मेदार हूं, उसमें currentUser
एक User
या व्युत्पन्न वर्ग है। जाहिर है, अगर आपका User.GetCurrent
इंट्रस्ट वापसी का है, तो शायद यह आपके लिए एक बाधा है।
इससे कोई लेना-देना नहीं है var
, लेकिन यदि आपके पास अजीब विरासत पदानुक्रम हैं, जहां आप अन्य विधियों (जैसे new public void DoAThing()
) के साथ छाया वाले तरीके हैं , तो यह न भूलें कि गैर-आभासी तरीके उस प्रकार से प्रभावित होते हैं जैसे वे डाले जाते हैं।
मैं एक वास्तविक विश्व परिदृश्य की कल्पना नहीं कर सकता जहां यह अच्छे डिजाइन का संकेत हो, लेकिन यह आपके उम्मीद के मुताबिक काम नहीं कर सकता है:
class Foo {
public void Non() {}
public virtual void Virt() {}
}
class Bar : Foo {
public new void Non() {}
public override void Virt() {}
}
class Baz {
public static Foo GetFoo() {
return new Bar();
}
}
var foo = Baz.GetFoo();
foo.Non(); // <- Foo.Non, not Bar.Non
foo.Virt(); // <- Bar.Virt
var bar = (Bar)foo;
bar.Non(); // <- Bar.Non, not Foo.Non
bar.Virt(); // <- Still Bar.Virt
जैसा कि संकेत दिया गया है, आभासी तरीके इससे प्रभावित नहीं होते हैं।
नहीं, var
वास्तविक चर के बिना आरंभ करने का कोई गैर-अनाड़ी तरीका नहीं है ।
var foo1 = "bar"; //good
var foo2; //bad, what type?
var foo3 = null; //bad, null doesn't have a type
var foo4 = default(var); //what?
var foo5 = (object)null; //legal, but go home, you're drunk
इस मामले में, बस इसे पुराने तरीके से करें:
object foo6;
var p = new X(); p.Z()
समान नहीं है SuperX p = new X(); p.Z()
, भले ही X : SuperX
। साथ स्थिर प्रकार के हमेशा ऊपर पहले उदाहरण में, लेकिन हमेशा दूसरे उदाहरण में। जागरूक होने के लिए एक सूक्ष्म लेकिन महत्वपूर्ण अंतर। लेकिन आपका उत्तर बहुत सही है :-)var
p
X
SuperX
var
कोड को कम स्पष्ट नहीं करता है। बल्कि मेरी राय में इसके विपरीत है। उदाहरण के लिए जब आप घोषणा करते हैं और इसे ( RadioButton radioButton = new RadioButton();
) (जब) एक ही पंक्ति पर टाइप दो (या यहां तक कि तीन) बार लिखते हैं ? var
जब आप अपने चर का नामकरण कर रहे हैं तो आप दो बार सोचते हैं क्योंकि यह प्रकार के बजाय कार्यक्षमता पर ध्यान केंद्रित करता है (उदाहरण के लिए UserCollection collection = new userRepository.GetUsers();
बल्कि स्वाभाविक रूप से अधिक बदल जाता है var users = userRepository.GetUsers();
)। अगर आपको लगता var
है कि यह स्पष्ट नहीं है, तो इसका उपयोग अप्रयुक्त है।
var
निश्चित रूप से कोड का उपयोग अच्छी तरह से कर सकता है, लेकिन यह अस्पष्ट भी बना सकता है जो बुरी तरह से उपयोग किया जाता है; कई स्वरूपण विकल्पों की तरह। यह संतुलन इस बात पर निर्भर करता है कि आप अनाम वस्तुओं और जेनेरिकों का कितना उपयोग करते हैं, दोनों में से कोई भी .NET 1.0 में मौजूद नहीं है, जो इसे C♯ के पहले संस्करण में एक काल्पनिक कीवर्ड के रूप में कम उपयोगी बनाता है। मैं केवल RadioButton
radioButton
एक कारखाने या सहायक विधि के मामले में एक नाम दूंगा जहां बटन के बारे में केवल एक चीज महत्वपूर्ण थी कि यह एक था RadioButton
, अन्यथा यह पागलपन के साथ या उसके बिना है var
।
var
, अगर उससे अधिक नहीं, लेकिन मैंने अपनी राय बदल दी है, और शायद यह अलग-अलग राय का सवाल जितना आसान है, क्योंकि मुझे लगता है कि आप गलत हैं जब आप कहते हैं कि यह एक है कोई फर्क नहीं पड़ता कि आप अनाम वस्तुओं और जेनरिक का कितना उपयोग कर रहे हैं;) प्रकार की घोषणा सबसे अधिक बार कोड शोर है, यदि आप कोड को समझे बिना नहीं समझ सकते हैं तो कोड शायद किसी भी मामले में अस्पष्ट है।
var
यदि आप अपने प्रोजेक्ट में लोम्बोक जोड़ते हैं तो आप इसके वैल कीवर्ड का उपयोग कर सकते हैं ।
final
आवश्यक नहीं है, अपरिवर्तनीय हैं। विचार करेंfinal StringBuilder strB = new StringBuilder("My reference is final"); strB.append("I'm not immutable");
var
। projectlombok.org/features/experimental/var.html
JEP - JDK एन्हांसमेंट-प्रस्ताव
http://openjdk.java.net/jeps/286
JEP 286: स्थानीय-परिवर्तनीय प्रकार का आविष्कार
लेखक ब्रायन गोएट्ज़
// Goals:
var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>
मैंने IntelliJ के लिए एक प्लगइन पकाया है - एक तरह से - आपको var
जावा में। यह एक हैक है, इसलिए सामान्य अस्वीकरण लागू होते हैं, लेकिन यदि आप अपने जावा विकास के लिए IntelliJ का उपयोग करते हैं और इसे आज़माना चाहते हैं, तो यह https://bitbucket.org/balpha/varsity पर है ।
20 मार्च को JDK 10 की रिलीज़ के साथ, JEP 286var
में निर्दिष्ट जावा में अब एक आरक्षित प्रकार का नाम (एक कीवर्ड नहीं - नीचे देखें) शामिल है । स्थानीय चर के लिए, निम्नलिखित अब जावा 10 या उच्चतर में मान्य है:
var map = new HashMap<String, Integer>();
var
जावा में आरक्षित प्रकार का नाम करने के लिए लगभग समान है var
में है कि दोनों अंतर्निहित टाइपिंग के लिए (महत्वपूर्ण अंतर के लिए नीचे देखें) की अनुमति देने के सी # में कीवर्ड। var
जावा का उपयोग केवल निम्नलिखित संदर्भों में निहित प्रकार के अनुमान के लिए किया जा सकता है (जैसा कि जेईपी 286: फाइनल में गणना की गई है ):
इसलिए फ़ील्ड, रिटर्न प्रकार, वर्ग नाम या इंटरफ़ेस नाम के लिए उपयोग var
नहीं किया जा सकता है। इसका तर्क स्थानीय चर को घोषित करने और परिभाषित करने में लंबे प्रकार के नामों को शामिल करने की आवश्यकता को दूर करने के लिए है, जैसा कि जेईपी 286 (ब्रायन गोएत्ज़ द्वारा लिखित) में कहा गया है :
हम डेवलपर्स को स्थानीय चर प्रकारों के अक्सर-अनावश्यक प्रकट घोषणा को समाप्त करने की अनुमति देकर, स्थिर प्रकार की सुरक्षा के लिए जावा की प्रतिबद्धता को बनाए रखते हुए जावा कोड लिखने से जुड़े समारोह को कम करके डेवलपर अनुभव में सुधार करना चाहते हैं।
var
जावा में स्कोपिंगयह ध्यान दिया जाना चाहिए कि var
जावा में एक कीवर्ड नहीं है, बल्कि एक आरक्षित प्रकार का नाम है। जेईपी 286 से उद्धृत:
पहचानकर्ता संस्करण कोई कीवर्ड नहीं है; इसके बजाय यह एक आरक्षित प्रकार का नाम है। इसका मतलब यह है कि एक चर, विधि या पैकेज नाम के रूप में var का उपयोग करने वाला कोड प्रभावित नहीं होगा; एक वर्ग या इंटरफ़ेस नाम के रूप में var का उपयोग करने वाला कोड प्रभावित होगा (लेकिन ये नाम व्यवहार में दुर्लभ हैं, क्योंकि वे सामान्य नामकरण परंपरा का उल्लंघन करते हैं)।
ध्यान दें कि चूंकि var
एक आरक्षित प्रकार का नाम है और कोई कीवर्ड नहीं है, फिर भी इसका उपयोग पैकेज के नाम, विधि के नाम, और चर नाम (इसके नए प्रकार-हस्तक्षेप भूमिका के साथ) के लिए किया जा सकता है। उदाहरण के लिए, निम्नलिखित var
जावा में मान्य उपयोग के सभी उदाहरण हैं :
var i = 0;
var var = 1;
for (var i = 0; i < 10; i++) { /* ... */ }
public int var() { return 0; }
package var;
जेईपी 286 से उद्धृत:
यह उपचार इनिशियलाइज़र वाले स्थानीय वैरिएबल, एन्हांस्ड फ़ॉर-लूप, और स्थानीय फ़ोर-लूप में घोषित स्थानीय लोगों के लिए प्रतिबंधित होगा; यह मेथड फॉर्मल्स, कंस्ट्रक्टर फॉर्मल्स, मेथड रिटर्न टाइप्स, फील्ड्स, कैच फॉर्मल्स या किसी अन्य प्रकार के वैरिएबल फॉर्मेशन के लिए उपलब्ध नहीं होगा।
var
जावा और सी में अंतरयह var
C # और जावा के बीच एक उल्लेखनीय अंतर है , इसमें निम्नलिखित शामिल हैं: var
C # में एक प्रकार के नाम के रूप में उपयोग किया जा सकता है, लेकिन जावा में वर्ग नाम या इंटरफ़ेस नाम के रूप में उपयोग नहीं किया जा सकता है। C # प्रलेखन के अनुसार (स्थानीय रूप से टाइप किए गए स्थानीय प्रकार) :
यदि एक प्रकार का नाम
var
स्कोप है, तोvar
कीवर्ड उस प्रकार के नाम को हल कर देगा और एक अनुमानित टाइप किए गए स्थानीय चर घोषणा के हिस्से के रूप में नहीं माना जाएगा।
var
C # में एक प्रकार के नाम के रूप में उपयोग करने की क्षमता कुछ जटिलता पैदा करती है और कुछ जटिल संकल्प नियमों का परिचय देती है, जिन्हें var
जावा var
में एक वर्ग या इंटरफ़ेस नाम के रूप में अस्वीकार करके टाला जाता है । var
C # में टाइप नामों की जटिलताओं के बारे में जानकारी के लिए , प्रतिबंध प्रतिबंधात्मक रूप से टाइप किए गए चर घोषणाओं पर लागू होते हैं । जावा में `var 'के लिए स्कोपिंग निर्णय के पीछे तर्क पर अधिक जानकारी के लिए, JEP 286: स्कोपिंग विकल्प देखें ।
var
खेतों या रिटर्न प्रकारों के लिए उपयोग नहीं कर सकते हैं ? नोट करना क्यों महत्वपूर्ण है?
var
जावा में खेतों या रिटर्न प्रकारों के लिए उपयोग नहीं किया जा सकता है। यह महत्वपूर्ण है क्योंकि यह प्रतिबंध var
संदर्भ-संवेदनशील बनाता है, जहां इसका उपयोग केवल कुछ संदर्भों (स्थानीय चर) में किया जा सकता है और अन्य में नहीं। यह जावा और सी # के बीच जरूरी अंतर नहीं है, जिसे नोट किया जाना चाहिए, लेकिन var
जावा में उपयोग करते समय सामान्य रूप से एक महत्वपूर्ण प्रतिबंध ।
var
एक क्लास नाम बना सकते हैं और इसे इस तरह से उपयोग कर सकते हैं । तकनीकी रूप से यह c # के मामले में एक "संदर्भ कीवर्ड" है, लेकिन जावा में ऐसा लगता है कि आप ऐसा नहीं कर सकते। यदि मैं गलत हूं तो मुझे सही करों।
var
जावा में क्लास नाम या इंटरफ़ेस नाम के रूप में उपयोग नहीं कर सकते (जो वैसे भी आम नहीं है), लेकिन आप इसे चर नामों, विधि नामों और पैकेज नामों के लिए उपयोग कर सकते हैं। उदाहरण के लिए, var var = 1;
एक वैध जावा स्टेटमेंट है लेकिन एक वर्ग को public class var {}
एक त्रुटि के रूप में घोषित करने की कोशिश कर रहा है as of release 10, 'var' is a restricted local variable type and cannot be used for type declarations
:। मैंने ऊपर दिए गए उत्तर को var
जावा में औचित्य पर अधिक विस्तार से जाने और var
सी # में इसके अंतर के बारे में अद्यतन किया है।
यह JDK 10 में समर्थित होगा। इसे शुरुआती एक्सेस बिल्ड में कार्रवाई में देखना भी संभव है ।
JEP 286 :
आरंभिक के साथ स्थानीय चर की घोषणाओं के प्रकार के विस्तार के लिए जावा भाषा को बढ़ाएं।
इसलिए अब लिखने के बजाय:
List<> list = new ArrayList<String>();
Stream<> stream = myStream();
तुम लिखो:
var list = new ArrayList<String>();
var stream = myStream();
टिप्पणियाँ:
var
अब एक आरक्षित प्रकार का नाम हैयदि आप अपने स्थानीय सिस्टम पर जावा को स्थापित किए बिना इसे आजमाना चाहते हैं, तो मैंने JDK 10 के साथ एक डॉकटर चित्र बनाया :
$ docker run -it marounbassam/ubuntu-java10 bash
root@299d86f1c39a:/# jdk-10/bin/jshell
Mar 30, 2018 9:07:07 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
| Welcome to JShell -- Version 10
| For an introduction type: /help intro
jshell> var list = new ArrayList<String>();
list ==> []
var
) समतुल्य नहीं है। में var
उदाहरण list
प्रकार का है ArrayList
, न कि एक List
।
एक सरल समाधान (यह मानते हुए कि आप एक सभ्य IDE का उपयोग कर रहे हैं) हर जगह सिर्फ 'int' टाइप करना है और फिर इसे आपके लिए टाइप सेट करना है।
मैंने वास्तव में सिर्फ 'var' नामक एक वर्ग जोड़ा है, इसलिए मुझे कुछ अलग लिखने की ज़रूरत नहीं है।
कोड अभी भी बहुत क्रियात्मक है, लेकिन कम से कम आपको इसे टाइप करने की आवश्यकता नहीं है!
int
) - क्या मुझे कुछ याद आ रहा है? (*: जबकि मैं कभी भी ग्रहण को एक सभ्य आईडीई नहीं कहूँगा, मैं दूसरों के लिए न्याय नहीं कर सकता ...)
Java 10 को लोकल वैरिएबल टाइप इंट्रेंस मिला, इसलिए अब यह var
C # एक के बराबर है (जहाँ तक मेरी जानकारी है)।
यह गैर-संप्रदायी प्रकारों का भी अनुमान लगा सकता है (प्रकार जिन्हें प्रोग्रामर द्वारा उस स्थान पर नाम नहीं दिया जा सकता है; हालांकि कौन से प्रकार गैर-संप्रदाय भिन्न हैं)। उदाहरणों var
और अनाम कक्षाओं के साथ ट्रिक्स देखें (कि आपको काम में कभी भी उपयोग नहीं करना चाहिए) ।
एक अंतर जो मुझे मिल सकता है वह यह है कि C # में,
जावा में 10 var
कानूनी नाम नहीं है।
जावा 10 के रूप में, बराबर है ... var
।
मुझे पता है कि यह पुराना है, लेकिन एक वर्ग वर्ग क्यों नहीं बनाया गया है और विभिन्न प्रकारों के साथ निर्माणकर्ता बना सकते हैं और इस बात पर निर्भर करते हैं कि किस प्रकार के निर्माणकर्ता आपको अलग-अलग प्रकारों के साथ संस्करण प्राप्त करते हैं। आप एक प्रकार से दूसरे में बदलने के लिए तरीकों का निर्माण भी कर सकते हैं।
Lombok
var का समर्थन करता है, लेकिन इसे अभी भी प्रायोगिक के रूप में वर्गीकृत किया गया है:
import lombok.experimental.var;
var number = 1; // Inferred type: int
number = 2; // Legal reassign since var is not final
number = "Hi"; // Compilation error since a string cannot be assigned to an int variable
System.out.println(number);
यहां इसका उपयोग करने से बचने के लिए एक नुकसान है IntelliJ IDEA
। यह अपेक्षा के अनुरूप काम करता है, हालांकि ऑटो समापन और सब कुछ शामिल है। जब तक "नॉन-हैकी" समाधान नहीं होता है (जैसे जेईपी 286 के कारण : स्थानीय-परिवर्तनीय प्रकार का आविष्कार ), तब तक यह आपका सबसे अच्छा दांव हो सकता है।
ध्यान दें कि बिना किसी संशोधन या निर्माण के बिना val
समर्थन है ।Lombok
lombok.config
आप जावा 10 में, लेकिन केवल स्थानीय के लिए कर सकते हैं चर के लिए, अर्थ,
आप ऐसा कर सकते हैं,
var anum = 10; var aString = "Var";
लेकिन नहीं कर सकते,
var anull = null; // Since the type can't be inferred in this case
अधिक जानकारी के लिए कल्पना की जाँच करें ।
var
गैर-प्रकार के कई प्रकारों के लिए उपयोग किया जा सकता है, जिसमें कैप्चर प्रकार, प्रतिच्छेदन प्रकार और अनाम वर्ग प्रकार शामिल हैं। और, जावा 11 के रूप में, इसे लैम्ब्डा मापदंडों पर भी लागू किया जा सकता है।
सामान्य तौर पर आप किसी भी प्रकार के लिए ऑब्जेक्ट क्लास का उपयोग कर सकते हैं, लेकिन आप बाद में टाइप कास्टिंग कर सकते हैं!
जैसे: -
Object object = 12;
Object object1 = "Aditya";
Object object2 = 12.12;
System.out.println(Integer.parseInt(object.toString()) + 2);
System.out.println(object1.toString() + " Kumar");
System.out.println(Double.parseDouble(object2.toString()) + 2.12);
var
अब आधिकारिक रूप से भाषा में इस शब्द के साथ , आपका उत्तर अब पुराने जमाने के तरीके का भी उल्लेख कर रहा है।
यह सुविधा अब जावा एसई 10 में उपलब्ध है। स्थिर, प्रकार-सुरक्षित संस्करण ने आखिरकार इसे जावा दुनिया में बनाया है :)
स्रोत: https://www.oracle.com/corporate/pressrelease/Java-10-032018.html
val
(याvar
) यदि आप एक विशेष "जावा रिप्लेसमेंट" भाषा का उपयोग करते हैं ;-)