2016-03-10 11 views
25

में पैकेज संरक्षित विकल्प कक्षा में हमारे पास कक्षाओं के लिए पैकेज संरक्षित (डिफ़ॉल्ट के रूप में) संशोधक है, जो एक ही पैकेज में कई कक्षाएं रखने की अनुमति देता है लेकिन केवल कुछ ही खुलासा करता है और तर्क को समाहित करता है।पैकेज कोटलिन

कोटलिन के साथ यह मामला नहीं लगता है, अगर मैं कुछ अन्य वर्गों को देखना चाहता हूं जो एक दूसरे के लिए दृश्यमान हों लेकिन आगे नहीं तो मुझे निजी संशोधक का उपयोग करना होगा जो एक फ़ाइल को दृश्यता सीमित करता है ... इसलिए अनिवार्य रूप से यदि आपके पास पैकेज में 10 कक्षाएं थीं और उनमें से केवल एक ही सार्वजनिक थी, तो इसमें सभी वर्गों के साथ एक विशाल फ़ाइल होगी (और private सभी जगहों पर) ...

क्या यह सामान्य अभ्यास है या वहां कोटलिन में कुछ समान मॉड्यूलरिटी हासिल करने का एक तरीका है?

मुझे समझ नहीं आता कि अगर वे क्यों किया वे पैकेज की रक्षा की पहुँच से छुटकारा पाने के पैकेज की धारणा है ...

उत्तर

19

Kotlin, जावा की तुलना में, एक डिग्री कम करने के लिए संकुल मॉडल पर भरोसा करने लगता है (उदाहरण के लिए निर्देशिका संरचना संकुल के लिए बाध्य नहीं है)। इसके बजाय, कोटलिन internal visibility प्रदान करता है, जिसे मॉड्यूलर प्रोजेक्ट आर्किटेक्चर के लिए डिज़ाइन किया गया है। इसका उपयोग करके, आप अपने कोड के एक हिस्से को एक अलग module के अंदर encapsulate कर सकते हैं।

तो, शीर्ष स्तर घोषणाओं पर आप

  • private उपयोग कर सकते हैं फ़ाइल
  • internal मॉड्यूल

इस बिंदु पर करने के लिए दृश्यता को प्रतिबंधित करने के लिए दृश्यता प्रतिबंधित करने के लिए, वहाँ कोई अन्य है दृश्यता प्रतिबंध के लिए विकल्प।

+4

मुझे आंतरिक पसंद है, लेकिन हम जावा 9 में बहुत बेहतर तय करेंगे, हालांकि मैंने कभी नहीं देखा है कि कोई भी कोड का उपयोग करने के लिए एक ही पैकेज बनायेगा ... आखिरकार अगर कोई मॉड्यूलरिटी का उल्लंघन करने के लिए इतना दृढ़ संकल्प रखता है यदि आवश्यक हो तो वह सिर्फ कोड पेस्ट करेगा ... जो मैं यहां चिंतित हूं वह उपयोगिता है। क्योंकि बस एक फ़ाइल में कोड का टन डालना गूंगा है ... – vach

+1

@vach मैंने वास्तव में देखा - और किया - वह। कुछ पुस्तकालय आपके उपयोग के मामलों से निराशाजनक रूप से अज्ञानी हैं (इसका मतलब यह नहीं है कि यह अच्छा अभ्यास है) – Lovis

+2

ठीक है लेकिन अभी मैं कोटालिन को एक जावा प्रोजेक्ट माइग्रेट कर रहा हूं, और मेरे पास बहुत अच्छी दृश्यता लागू है, टिपिकल इन कुछ सुविधाएं हैं जो बनी हैं 4-5 कक्षाएं जिनमें से केवल एक बाहरी दुनिया के लिए दृश्यमान है ... अब कोटलिन के साथ मेरे पास एक ही दृश्यता रखने का कोई विकल्प नहीं है जब तक कि मैं सब कुछ एक ही फाइल में नहीं डालता ... क्या मैं इसे सही ढंग से समझता हूं या कुछ अन्य है दृष्टिकोण मैं नहीं जानता? – vach

2

@hotkeys बताते हैं, तो आप कीवर्ड का उपयोग module में कर सकते हैं। मैं आम तौर पर ग्रहण और मेवेन के साथ काम करता हूं और यह मेरे लिए इन मॉड्यूल बनाने के लिए व्यावहारिक नहीं है।

शायद आईडीईए या ग्रैडल के साथ एक अलग तकनीकी ढेर के लिए यह अधिक व्यावहारिक है; मुझे नहीं पता क्योंकि मैंने कभी उनका इस्तेमाल नहीं किया था।

दूसरा विकल्प पैकेज के सभी वर्गों को एक फ़ाइल के अंदर डाल रहा है। यह हमेशा व्यावहारिक या सुरुचिपूर्ण नहीं है।

मेरे लिए, package दृश्यता इसके दस्तावेज़ मूल्य के लिए बेहद उपयोगी है। मैं जानना चाहता हूं कि बाकी परियोजना के लिए कुछ पैकेज क्या सार्वजनिक इंटरफ़ेस पेश कर रहा है। मैं फैक्ट्री कार्यान्वयन कक्षाओं को छिपाना चाहता हूं और इसी तरह।

तो जावा में पैकेज-निजी वर्गों और विधियों के लिए अपना रास्ता हैक करना संभव है, फिर भी मैं package कीवर्ड का उपयोग करना चाहता हूं।

package com.mycompany.libraries.kotlinannotations; 

import static java.lang.annotation.ElementType.CONSTRUCTOR; 
import static java.lang.annotation.ElementType.METHOD; 
import static java.lang.annotation.ElementType.TYPE; 
import static java.lang.annotation.RetentionPolicy.SOURCE; 

import java.lang.annotation.Documented; 
import java.lang.annotation.Retention; 
import java.lang.annotation.Target; 

@Documented 
@Retention(SOURCE) 
@Target({ TYPE, METHOD, CONSTRUCTOR }) 
/** 
* Use in Kotlin code for documentation purposes. 
* 
* Whenever a Kotlin class or method is intended to be accesible at package level only. 
* 
*/ 
public @interface PackagePrivate { 

} 

तो मैं किसी भी Kotlin परियोजना में यह व्याख्या का उपयोग कर सकते हैं:

मैं क्या किया है एक भी टिप्पणी के साथ एक प्रोजेक्ट बना है।

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

फिलहाल कोटलिन pmd (यानी अपने मॉड्यूल के साथ) समर्थित भाषाओं में से एक नहीं है। लेकिन पीएमडी सक्रिय विकास में है और कोटलिन लोकप्रियता में बढ़ रहा है, इसलिए किसी मौके पर इसे विकसित करने का मौका है। यह सिर्फ मेरा सबसे अच्छा अनुमान है।