2009-06-01 12 views
5

मैं एक जावा वर्ग है कि 3 पैरामीटर स्वीकार के लिए एक initialisation विधि बनाने के लिए करना चाहते हैं:प्रबलित ऐरे आकार पैरामीटर्स के साथ जावा विधि?

Employee[] method(String[] employeeNames, Integer[] employeeAges, float[] employeeSalaries) 
{ 
    Employee myEmployees[] = new Employee[SIZE];// dont know what size is 

    for (int count = 0; count < SIZE; count++) 
    { 
     myEmployees[count] = new Employee(employeeNames[count], employeeAges[count], employeeSalaries[count]); 
    } 
    return myEmployees; 
} 

आप इस कोड गलत है कि देख सकते हैं। वह SIZE चर परिभाषित नहीं है। मेरी समस्या यह है कि मैं 3 सरणी में गुजरना चाहता हूं, लेकिन मैं जानना चाहता हूं कि क्या मैं यह सुनिश्चित कर सकता हूं कि तीन सरणी एक ही सरणी आकार के हैं। इस प्रकार लूप के लिए विफल नहीं होगा, क्योंकि लूप में कन्स्ट्रक्टर सरणी के सभी मानकों का उपयोग करता है।

शायद जावा की एक अलग सुविधा है जो मेरी समस्या का समाधान लागू कर सकती है। मैं SIZE नामक एक और पैरामीटर स्वीकार कर सकता हूं जिसका उपयोग लूप के लिए किया जाएगा, लेकिन यह मेरी समस्या का समाधान नहीं करता है यदि पैरामीटर 1 और 2 आकार 10 के हैं और तीसरा पैरामीटर आकार 9 की एक सरणी है।

तो बस परेशान करने के लिए मैं स्पष्ट नहीं था। मैं कैसे लागू कर सकता हूं कि 3 तर्क सभी सरणी हैं जिनमें सटीक तत्वों की संख्या समान है?

सरणी आकार निर्दिष्ट करने वाले अतिरिक्त पैरामीटर का उपयोग करना बहुत ही सुरुचिपूर्ण और गंदे प्रकार का नहीं है। यह समस्या को हल नहीं करता है सरणी पैरामीटर में विभिन्न आकार के सरणी होते हैं।

उत्तर

16

आप इसे संकलित समय पर लागू नहीं कर सकते हैं। आप मूल रूप से निष्पादन समय पर यह जांच करने के लिए, और एक अपवाद फेंक अगर बाधा नहीं मिले है:

Employee[] method(String[] employeeNames, 
        Integer[] employeeAges, 
        float[] employeeSalaries) 
{ 
    if (employeeNames == null 
     || employeeAges == null 
     || employeeSalaries == null) 
    { 
     throw new NullPointerException(); 
    } 
    int size = employeeNames.length; 
    if (employeesAges.length != size || employeeSalaries.length != size) 
    { 
     throw new IllegalArgumentException 
      ("Names/ages/salaries must be the same size"); 
    } 
    ... 
} 
+0

धन्यवाद जॉन एक बिल्डर, उदाहरण के लिए, EmployeeArrayBuilder बनाने के लिए है, उत्कृष्ट जवाब! –

+2

यह एक अच्छा उदाहरण है जिसे मैं NullPointerException का उपयोग करने का गलत तरीका मानता हूं। मैं प्रत्येक पारित पैरामीटर (कर्मचारी नाम == नल) { नए अवैध अर्ग्यूमेंट अपवाद ("कर्मचारी नाम == शून्य") को फेंकने के लिए प्रत्येक व्यक्ति के लिए व्यक्तिगत जांच करेगा; } इससे समस्या का निदान करने के लिए स्टैकट्रैक अधिक उपयोगी हो जाता है। –

+0

मुझे लगता है कि इस मामले में एनपीई फेंकने के लिए स्वीकार्य है (जबकि कोई भी आईएई फेंकने से असहमत नहीं होगा); लेकिन शायद इस बहस/विवाद में एक समझौता के रूप में एनपीई के साथ एक संदेश शामिल करना बेहतर होगा। –

2

के बाद से सरणियों में क्रम से पहले जेनरेट नहीं कर रहे हैं पारित किया जा रहा है, यह विधि को रोकने के लिए संभव नहीं है एक संकलन-समय जांच के रूप में पारित सरणी की विशेषताओं के आधार पर पूरा करने से कॉल करें।

जैसा कि जॉन स्कीट ने उल्लेख किया है, एक समस्या का संकेत देने का एकमात्र तरीका IllegalArgumentException या प्रक्रिया को रोकने के लिए रनटाइम की तरह है जब विधि को गलत पैरामीटर के साथ बुलाया जाता है।

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

0

एक तरह से समस्या को हल करने के लिए स्कर्ट,

public class EmployeeArrayBuilder { 
    private Integer arraySize = null; 
    private String[] employeeNames; 
    public EmployeeArrayBuilder addName(String[] employeeNames) { 
     if (arraySize == null) { 
     arraySize = employeeNames.length; 
     } else if (arraySize != employeeNames.length) { 
     throw new IllegalArgumentException("employeeNames needs to be " + arraySize + " in length"); 
     } 
     this.employeeNames = employeeNames; 
     return this; 
    } 
    public EmployeeArrayBuilder addSalaries(float[] employeeSalaries) {/* similar to above */} 
    public EmployeeArrayBuilder addAges(Integer[] employeeAges) {/* similar */} 
    public Employee[] build() { 
     // here, you can do what you needed to do in the constructor in question, and be sure that the members are correctly sized. 
     Employee myEmployees[] = new Employee[arraySize ];// dont know what size is    
     for (int count = 0; count < arraySize ; count++) { 
      myEmployees[count] = new Employee(employeeNames[count], employeeAges[count], employeeSalaries[count]); 
     } 
     return myEmployees; 
    } 
} 
+0

मुझे कोई निर्माता नहीं लगता यहां उचित है क्योंकि एपीआई में कुछ भी सुझाव नहीं है कि उम्र, नाम और वेतन सभी आवश्यक हैं। जब आप वैकल्पिक तर्क प्राप्त कर सकते हैं तो बिल्डर उपयुक्त है। यह जॉन स्कीट के उत्तर की तुलना में भी जटिल है। –

+0

@ केन लियू: दोनों एक ही समस्या हल करता है - मैंने इसे पोस्ट किया क्योंकि दूसरा समाधान पहले से ही पोस्ट किया गया है, इसलिए डुप्लिकेट क्यों करें? और यह एक विकल्प है जो कुछ विचारों को वारंट करता है। दरअसल एपीआई में कुछ भी तर्क नहीं है कि ये आवश्यक तर्क हैं, लेकिन इससे कुछ भी दूर नहीं होता है निर्माता पैटर्न। – Chii

संबंधित मुद्दे