जावा 1.4.2 के बाद से मैंने जो कुछ भी याद किया है उसे पकड़ने में मेरी मदद करें [बंद]


14

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

चर्चा के लायक नहीं होने के कारण, मेरी पिछली इंटर्नशिप ने मुझे केवल जावा 1.3 और 1.4 एसडीके के लिए कोडिंग की थी। इसके अलावा, मेरी विश्वविद्यालय शिक्षा ने मुख्य रूप से एल्गोरिदम, डेटा संरचनाओं और अन्य सिद्धांत पर ध्यान केंद्रित किया है, न कि भाषा की विशेषताओं या पुस्तकालयों पर।

तो, मन में उपरोक्त के साथ, जावा के वर्तमान संस्करण में क्या विशेषताएं, कक्षाएं आदि हैं (अब, वैसे भी हम किस नंबर पर हैं?) पढ़ने के लिए मेरे समय के लायक होगा और क्यों? 1.4.2 के बाद से मुझे क्या याद आया जो प्रोग्रामर के रूप में आपके जीवन को आसान बनाता है?

उदाहरण और आप कैसे एक विशेष पैकेज या कुछ इस तरह की खोज की कहानियों और उपयोग करने के लिए भी महान होगा।


4
ये कौन से कारण हैं जो चर्चा करने लायक नहीं हैं? हम में से बहुत से लोग
अंतर्ग्रही

@ 5arx खैर मैंने रोबोटिक्स प्रोग्रामिंग के लिए जावा के 1.4 संस्करण के साथ काम किया क्योंकि किसी कारण से जो हमारे मंच ने समर्थन किया था।
डैनियल ग्रैज़र

जवाबों:


15

जिन परिवर्तनों को मैं सबसे महत्वपूर्ण मानता हूं वे हैं:

  • जेनरिक (जैसे टाइप किए गए संग्रह, जैसे सेट)

  • लूप के लिए बढ़ाया (के लिए (स्ट्रिंग s: सेट) {...})

  • ऑटोबॉक्सिंग / अनबॉक्सिंग (स्वचालित रूप से इंटर्गर जैसे प्रकारों के बीच अंतर और इसके विपरीत में परिवर्तित)

  • टाइपसेफ एनम (एनम अब एक कीवर्ड है, एनम से बाहर टाइप किए जा सकते हैं)

  • वैरग्स (प्रिंटफ के लिए) फ़ंक्शन, चर संख्या के तर्क की अनुमति देता है)

  • स्थैतिक आयात (अब एक वर्ग के स्थिर तरीकों को आयात कर सकता है, जैसे java.lang.Math)

  • एनोटेशन

  • java.util.concurrent (जावा की संक्षिप्तता प्रदर्शित करता है)

यह भी पढ़ें कि आप किस जावा का लक्ष्य बना रहे हैं? , तीन संस्करणों में से प्रत्येक की बेहतर समझ प्राप्त करने के लिए।


1
++ लूप के लिए बढ़ाया गया, ऑटोबॉक्सिंग / अनबॉक्सिंग, वेरगेज, स्टैटिक इम्पोर्ट सिंपल हैं
माइकल वाइल्स

जावा प्रोग्रामर प्रत्येक लूप को "एन्हांस्ड forलूप्स " क्यों कहते हैं ?
मैक्स फेयर

2
@Maxpm क्योंकि यह जावा भाषा विनिर्देश में कैसे कहा जाता है। जेएलएस के अनुसार, लूप के लिए बुनियादी और लूप के लिए बढ़ाया गया है। मुझे यकीन नहीं है कि उन्होंने ऐसा करने का फैसला क्यों किया। शायद इसलिए कि वाक्यविन्यास सामान्य लूप के साथ विशेष कीवर्ड और ब्लेंड्स का उपयोग नहीं करता है।
माल्कॉम

10

आपके दिन-प्रतिदिन के प्रोग्रामिंग जीवन में सबसे महत्वपूर्ण बदलाव जेनेरिक की शुरूआत है जो कि संभवतः आपके द्वारा लिखे गए हर नए मॉड्यूल में उपयोग किया जाएगा, और यह एक भ्रमित करने वाला नया सिंटैक्स है।

जेनरिक एक ऐसा तंत्र है List, जिसमें नग्न वस्तुओं के बजाय तार समाहित करने की अनुमति होती है, जहां कंपाइलर लागू करता है कि सूची में डाली जाने वाली वस्तु एक स्ट्रिंग है, और यह जानता है कि जब आपको किसी सूची से कोई आइटम मिलता है तो वह स्ट्रिंग है ।

यह बेहतर कार्यक्रमों के लिए बनाता है क्योंकि आप लक्ष्य प्रकार के लिए स्पष्ट रनटाइम कास्ट से बचते हैं (जो कि गलत होने पर अक्सर त्रुटियों का स्रोत होता है) और आईडीई आपको सभी गंदे काम करने में मदद कर सकता है क्योंकि यह आपके कोड के बारे में बहुत कुछ जानता है यह तब हुआ जब यह केवल वस्तुओं की सूची थी।

जोशुआ बलोच ने जेनरिक का एक अच्छा परिचय लिखा है, जो http://java.sun.com/docs/books/effective/ पर नमूना अध्याय के रूप में उपलब्ध है


कृपया ग्रूवी लोगों को न बताएं! "यह बेहतर कार्यक्रमों के लिए बनाता है क्योंकि आप लक्ष्य प्रकार के रनटाइम कास्ट से बचते हैं।" def whatever....
डैन रोसेनस्टार्क

@ यार, और अधिक स्पष्ट होने के लिए संपादित किया गया। मैं "def" या "var" विशेषता को प्यार करता हूँ । मेरे जीवन को थोड़ा आसान बना देगा।

हां, मैं अभी हाल ही में Objective-C के साथ यही सोच रहा था और idजो है defया var.... लेकिन फिर, 100% स्थैतिक टाइपिंग की सुरक्षा अद्भुत है, वास्तव में।
दान रोसेनस्टार्क

@ यार: आप एडा को पसंद करेंगे :)
Mattnz

@mattnz क्यों, विशेष रूप से? और जब हम यहाँ हैं, क्या यह JVM पर चलता है?
बजे दान रोसेनस्टार्क

6

ऑटोबॉक्सिंग जावा 5 के साथ पेश की गई एक अच्छी सुविधा है। सी # की तरह ही कंपाइलर अब आदिम (बेसिक) प्रकारों और उनके संबंधित ऑब्जेक्ट रैपर क्लासेस (इंटेगर आदि) और फिर से वापस के बीच एक स्वचालित रूपांतरण करता है। जावा कलेक्शंस के साथ काम करने से दर्द कम होता है।

जावा 5 में प्रत्येक लूपिंग नया था, मुझे भी लगता है। यह सरणियों (और संग्रह) पर पुनरावृत्ति को आसान बनाता है, क्योंकि यह सूचकांक सूचकांक या पुनरावृत्तियों के सेटअप और प्रबंधन से जुड़े सामान्य अव्यवस्था को समाप्त करता है। उदाहरण पर:

void myMethod(Collection<myObjectType> c) {
    for (myObjectType o : c)
        o.foo();
}

6

Enums , अंतिम स्टैटिक्स और स्थिरांक को बदलने के लिए और आपको स्ट्रिंग्स और जादू की संख्या के संदर्भों को हटाने में मदद करते हैं। सूरज / अलंकृत में अच्छे लोगों से लिया गया एक उदाहरण :

public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7),
    PLUTO   (1.27e+22,  1.137e6);

    private final double mass;   // in kilograms
    private final double radius; // in meters
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    public double mass()   { return mass; }
    public double radius() { return radius; }

    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    public double surfaceGravity() {
        return G * mass / (radius * radius);
    }
    public double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
}

तथा

public static void main(String[] args) {
        double earthWeight = Double.parseDouble(args[0]);
        double mass = earthWeight/EARTH.surfaceGravity();
        for (Planet p : Planet.values())
           System.out.printf("Your weight on %s is %f%n",
                             p, p.surfaceWeight(mass));
    }

6

java.util.concurrent 1.5 में पेश किया गया था। इसे सीखने के लिए सबसे अच्छा संसाधन है (शायद) अभ्यास पुस्तक में जावा कॉनएरेबिलिटी । IMHO संगामिति किसी भी चीज़ की तुलना में जावा का सबसे महत्वपूर्ण प्रतिस्पर्धी लाभ है इसलिए यह निश्चित रूप से अच्छी तरह से जानने योग्य है।


1
+1 समवर्ती पैकेज का उल्लेख करने के लिए। यह दुख की बात है कि इतने सारे डेवलपर्स अभी भी थ्रेड, वेट () / सूचना () और समकालित जैसे समसामयिक आदिम का उपयोग करते हैं, ...
ओलिवर वेइलर

वास्तव में। java.util.concurrentसंगामिति करने के लिए प्राथमिक स्मृति प्रबंधन के लिए स्वचालित मेमोरी प्रबंधन की तरह है। उत्तरार्द्ध का उपयोग करना डिबगिंग पर अपना अधिक समय बिताने का एक नुस्खा है और कोई लाभ नहीं देता है।
जूनास पुलकका

बचाव के लिए अधिकारियों! जावा 6 में भी बेहतर है

+1000 अगर मैं कर सकता था - वह किताब अद्भुत है
गैरी रोवे

4

खैर, StringBuilderमुझे अपने कार्यक्रम को गति देने में मदद की। यह StringBufferबिना धागा सुरक्षा के बराबर है ।


हां। प्रभावी जावा बताता है कि स्ट्रिंगरबफ़र अप्रचलित है और इसे स्ट्रिंगबर्ल द्वारा प्रतिस्थापित किया जाना चाहिए।
गैरी रोवे

1
स्ट्रिंग्स के साथ +सामंजस्य स्वचालित रूप से स्रोत स्तर 1.5 और उच्चतर के लिए स्ट्रिंगबर्गर के बजाय स्ट्रिंगब्यूलर का उपयोग करता है।

4

मैं @ykombinator से उपयोगी उत्तर को वर्गीकृत करके मदद करूंगा। उनकी सूची उन तत्वों की एक सूची है जो आप "सामान्य" जावा विकास करते समय दैनिक आधार पर उपयोग करेंगे।

कम प्रभाव और कम कठिनाई:

  • लूप के लिए बढ़ाया (के लिए (स्ट्रिंग s: सेट) {...})
  • ऑटोबॉक्सिंग / अनबॉक्सिंग (स्वचालित रूप से इंटर्गर जैसे प्रकारों के बीच अंतर और इसके विपरीत में परिवर्तित)
  • वैरग्स (प्रिंटफ के लिए) फ़ंक्शन, चर संख्या के तर्क की अनुमति देता है)
  • स्थैतिक आयात (अब एक वर्ग के स्थिर तरीकों को आयात कर सकता है, जैसे java.lang.Math)

उच्च प्रभाव और मध्यम कठिनाई:

  • टाइपसेफ एनम (एनम अब एक कीवर्ड है, एनम से बाहर टाइप किए जा सकते हैं)

उच्च प्रभाव और उच्च कठिनाई:

  • एनोटेशन
  • जेनेरिक्स

कम प्रभाव और उच्च कठिन (केवल तब तक उपयोग करेगा जब तक आप उन्नत थ्रेडिंग नहीं करते)

  • java.util.concurrent (जावा की संक्षिप्तता प्रदर्शित करता है)

इसलिए मैं सुझाव दूंगा कि आप डॉक्स के माध्यम से पढ़ें / कम प्रभाव कम मुश्किल टुकड़ों पर मदद करें - उन्हें लेने में आसान है। एनोटेशन और जेनरिक पर एक लो टोफ टाइम बिताएं - एनोटेशन बहुत उपयोगी हैं, और जेनेरिक बल्कि जटिल हो सकते हैं।

यदि आपको थ्रेडिंग करने की आवश्यकता है तो केवल नई संगामिति सामग्री देखें।


4

चूंकि मैं टिप्पणी नहीं कर सकता, क्योंकि मैं 50 से नीचे का हूं और मैं एक उत्तर छोड़ दूंगा। यह पहले से ही उल्लेख किया गया है, लेकिन मैं इसे फिर से दोहराऊंगा: एनोटेशन! मेरे वर्षों के जावा अनुभव में इस तरह की मेटाडेटा सबसे महत्वपूर्ण बात बन गई। यह अच्छी तरह से इस्तेमाल कुछ चौखटे की तरह यह कोड को अधिक संक्षिप्त और साफ बनाता है। उदाहरण के लिए, एनोटेशन कर सकते हैं:

  • किसी ऑब्जेक्ट को एक इकाई @Entity में कनवर्ट करें
  • एक विधि को REST सेवा @GET में परिवर्तित करें
  • बता दें कि एक तरीका null @nonnull कभी नहीं लौटाएगा
  • निर्भरता इंजेक्शन @inject के लिए एक क्षेत्र के लिए एक वस्तु सेट करें

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


2
सटीक एनोटेशन इन चीजों को नहीं कर सकते हैं, क्योंकि वे कोड में मेटा-जानकारी डालते हैं, जो अन्य कोड - अक्सर एक विशेष क्लास लोडर - पर कार्रवाई कर सकते हैं। मैं एनोटेशन को बहुत सारी समस्याओं का एक बहुत अच्छा सामान्य समाधान मानता हूं।

3

उदाहरण से सीखना मेरे लिए काम करता है

यहाँ मुहावरेदार जावा 6 का एक त्वरित उदाहरण है

public class Main {
  public static void main(String[] args) {
    // Shows a list forced to be Strings only
    // The Arrays helper uses generics to identify the return type
    // and takes varargs (...) to allow arbitary number of arguments
    List<String> genericisedList = Arrays.asList("A","B","C");

    // Demonstrates a for:each loop (read as for each item in genericisedList)
    for (String item: genericisedList) {
      System.out.printf("Using print formatting: %s%n",item);
    }

    // Note that the object is initialised directly with a primitive (autoboxing)
    Integer autoboxedInteger = 1;
    System.out.println(autoboxedInteger);

  }
}

Java5 से परेशान न हों, इसे Java6 के संबंध में दर्शाया गया है।

अगला चरण, एनोटेशन। ये सिर्फ आपके कोड के पहलुओं को परिभाषित करते हैं जो एनोटेशन पाठकों को आपके लिए बॉयलरप्लेट कॉन्फ़िगरेशन में भरने की अनुमति देते हैं। एक साधारण वेब सेवा पर विचार करें जो JAX-RS विनिर्देश का उपयोग करती है (इसे RESTful URIs समझती है)। आप सभी बुरा WSDL करने और Axis2 आदि के बारे में mucking करने से परेशान नहीं करना चाहते हैं, आप एक त्वरित परिणाम चाहते हैं। ठीक है, यह करो:

// Response to URIs that start with /Service (after the application context name)
@Path("/Service")
public class WebService {

  // Respond to GET requests within the /Service selection
  @GET
  // Specify a path matcher that takes anything and assigns it to rawPathParams
  @Path("/{rawPathParams:.*}")
  public Response service(@Context HttpServletRequest request, @PathParam("rawPathParams") String rawPathParams) {
    // Do some stuff with the raw path parameters 

    // Return a 200_OK
    return Response.status(200).build();
  }
}

बैंग। अपने web.xml में कॉन्फ़िगरेशन जादू के एक छोटे से छिड़काव के साथ आप बंद हैं। यदि आप मावेन के साथ निर्माण कर रहे हैं और जेट्टी प्लगइन को कॉन्फ़िगर किया गया है, तो आपकी परियोजना का बॉक्स के ठीक बाहर छोटा वेब सर्वर होगा (आपके लिए JBoss या Tomcat के साथ कोई फ़िडलिंग नहीं है), और उपरोक्त कोड यूआरआई का जवाब देगा प्रपत्र:

GET http://localhost:8080/contextName/Service/the/raw/path/params

काम हो गया।


3

वाह जो अतीत से एक विस्फोट था! मैंने अभी 4 वर्षों के लिए जावा का उपयोग नहीं किया है - और उस समय में कुछ भी नहीं बदला है!

संस्करण द्वारा सुविधाओं की एक सूची है , लेकिन यहाँ महत्वपूर्ण बिट (पाठ्यक्रम की साहित्यिक चोरी है ...)

J2SE 5.0 (30 सितंबर, 2004)

  • जेनरिक: संकलन के लिए संकलन-समय (स्थिर) प्रकार की सुरक्षा प्रदान करता है और अधिकांश टाइपकास्ट्स (प्रकार रूपांतरण) की आवश्यकता को समाप्त करता है।
  • मेटाडेटा: इसे एनोटेशन भी कहा जाता है; अतिरिक्त डेटा के साथ वर्गों और विधियों को टैग करने के लिए भाषा निर्माण की अनुमति देता है, जिसे तब मेटाडेटा-अवगत उपयोगिताओं द्वारा संसाधित किया जा सकता है।
  • ऑटोबॉक्सिंग / अनबॉक्सिंग: आदिम प्रकार (जैसे इंट) और आदिम आवरण वर्ग (जैसे इंटेक्स) के बीच स्वचालित रूपांतरण।
  • Enumerations: Enum keyword एक typeafe बनाता है, मानों की सूची क्रमबद्ध करता है (जैसे Day.MONDAY, Day.TUESDAY, आदि)। पहले यह केवल गैर-टाइपसेफ़ स्थिर पूर्णांकों या मैन्युअल रूप से निर्मित कक्षाओं (टाइपसेफ एनम पैटर्न) द्वारा प्राप्त किया जा सकता था।
  • स्विंग: नई स्किनेबल दिखती है और महसूस होती है, जिसे संश्लेषण कहा जाता है।
  • वरार्ग्स: एक विधि के अंतिम पैरामीटर को अब तीन डॉट्स (जैसे शून्य ड्रॉटेक्स्ट (स्ट्रिंग ... लाइनें)) के बाद टाइप नाम का उपयोग करके घोषित किया जा सकता है। कॉलिंग कोड में उस प्रकार के किसी भी पैरामीटर का उपयोग किया जा सकता है और फिर उन्हें विधि को पारित करने के लिए एक सरणी में रखा जाता है, या वैकल्पिक रूप से कॉलिंग कोड उस प्रकार के एक सरणी को पास कर सकता है।
  • प्रत्येक लूप के लिए संवर्धित: लूप सिंटैक्स को किसी सरणी या किसी Iterable के प्रत्येक सदस्य पर पुनरावृत्ति करने के लिए विशेष सिंटैक्स के साथ विस्तारित किया जाता है, जैसे कि मानक संग्रह कक्षाएं, फॉर्म के निर्माण का उपयोग करके:

जावा एसई 6 (11 दिसंबर, 2006)

  • पुराने Win9x संस्करणों के लिए समर्थन गिरा दिया गया। अनौपचारिक रूप से जावा 6 अपडेट 7 विंडोज के इन संस्करणों पर काम करने के लिए दिखाया गया जावा का अंतिम रिलीज है। यह अपडेट 10 में बड़े बदलाव के कारण माना जा रहा है।
  • स्क्रिप्टिंग लैंग्वेज सपोर्ट: स्क्रिप्टिंग भाषाओं के साथ टाइट इंटीग्रेशन के लिए जेनेरिक एपीआई और बिल्ट-इन मोज़िला जावास्क्रिप्ट राइनो इंटीग्रेशन
  • मुख्य मंच और स्विंग के लिए नाटकीय प्रदर्शन में सुधार।
  • JAX-WS के माध्यम से बेहतर वेब सेवा समर्थन
  • JDBC 4.0 सपोर्ट।
  • जावा कंपाइलर एपीआई एक एपीआई है जो जावा प्रोग्राम को जावा कंपाइलर को प्रोग्रामेटिक रूप से चुनने और इनवॉइस करने की अनुमति देता है।
  • संस्करण 2.0 में JAXB का नवीनीकरण: एक Stax पार्सर के एकीकरण सहित।
  • प्लग-इन एनोटेशन के लिए समर्थन
  • कई GUI सुधार, जैसे कि एपीआई में स्विंगवॉकर का एकीकरण, तालिका छँटाई और फ़िल्टरिंग, और सच्चा स्विंग डबल-बफ़रिंग (ग्रे-एरिया प्रभाव को समाप्त करना)।
  • जेवीएम में सुधार शामिल हैं: सिंक्रनाइज़ेशन और कंपाइलर प्रदर्शन अनुकूलन, नए एल्गोरिदम और मौजूदा कचरा संग्रह एल्गोरिदम में अपग्रेड, और एप्लिकेशन स्टार्ट-अप प्रदर्शन।

यह इसके बारे में। जावा एसई 7.0 अधिक दिलचस्प लगता है, लेकिन अभी तक जारी नहीं किया गया है।

पिछले 4 वर्षों में C # में कितनी नई भाषा सुविधाएँ और API जोड़े गए हैं, यह देखते हुए, मैं काफी हैरान हूं। सन / ओरेकल पर क्या हो रहा है?


सूर्य ने स्रोत जावा खोलने का फैसला किया। यह वह जगह है बात यह है कि Oracle करने के लिए फैसला करता है, भले ही हम अभी भी लिनक्स बक्से पर OpenJDK चला सकते हैं सुनिश्चित किया है कि। इससे उन्हें केवल 18-24 महीने की देरी हुई ...

@ Thorbjørn - यह समझा सकता है। यह शर्म की बात है कि इस अधिग्रहण के कारण कितना व्यवधान हुआ। मुझे लगता है कि C # को तुलनात्मक स्थिरता प्राप्त है: हमने 2006 से लंबोदा लिया है - जहां वे देखते हैं कि वे 2012 तक जावा में नहीं आएंगे।
शेखजाबूटी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.