2016-06-11 6 views
10

से दिखाई देने वाले स्कैला में पैकेज-निजी दायरा मुझे स्कैला स्कॉपिंग के एक सुंदर अजीब व्यवहार के बारे में पता चला जब स्कैला कोड से उत्पन्न बाइटकोड जावा कोड से उपयोग किया जाता है। स्पार्क का उपयोग कर निम्नलिखित स्निपेट पर विचार करें (1.4 स्पार्क, Hadoop 2.6):जावा

import java.util.Arrays; 
import java.util.List; 

import org.apache.spark.SparkConf; 
import org.apache.spark.api.java.JavaSparkContext; 
import org.apache.spark.broadcast.Broadcast; 

public class Test { 
    public static void main(String[] args) { 
     JavaSparkContext sc = 
      new JavaSparkContext(new SparkConf() 
           .setMaster("local[*]") 
           .setAppName("test")); 

     Broadcast<List<Integer>> broadcast = sc.broadcast(Arrays.asList(1, 2, 3)); 

     broadcast.destroy(true); 

     // fails with java.io.IOException: org.apache.spark.SparkException: 
     // Attempted to use Broadcast(0) after it was destroyed 
     sc.parallelize(Arrays.asList("task1", "task2"), 2) 
      .foreach(x -> System.out.println(broadcast.getValue())); 
    } 
} 

इस कोड को विफल रहता है, जो उम्मीद है के रूप में मैं स्वेच्छा से उपयोग करने से पहले एक Broadcast को नष्ट, लेकिन बात यह है कि मेरी मानसिक मॉडल में ऐसा नहीं होना चाहिए यहां तक ​​कि संकलित करें, अकेले चलने दें।

दरअसल, Broadcast.destroy(Boolean) को private[spark] के रूप में घोषित किया गया है, इसलिए यह मेरे कोड से दिखाई नहीं देनी चाहिए। मैं Broadcast के बाइटकोड को देखने का प्रयास करूंगा लेकिन यह मेरी विशेषता नहीं है, इसलिए मैं इस प्रश्न को पोस्ट करना पसंद करता हूं। इसके अलावा, खेद है कि मैं एक उदाहरण बनाने के लिए बहुत आलसी था जो स्पार्क पर निर्भर नहीं है, लेकिन कम से कम आपको यह विचार मिलता है। ध्यान दें कि मैं स्पार्क के विभिन्न पैकेज-निजी तरीकों का उपयोग कर सकता हूं, यह केवल Broadcast नहीं है।

क्या हो रहा है इसके बारे में कोई विचार?

उत्तर

15

हम एक सरल उदाहरण के साथ इस मुद्दे को फिर से संगठित हैं:

package yuvie 

class X { 
    private[yuvie] def destory(d: Boolean) = true 
} 

और जावा में इस डिकंपाइल:

[[email protected] yuvie]$ javap -p X.class 
Compiled from "X.scala" 
public class yuvie.X { 
    public boolean destory(boolean); 
    public yuvie.X(); 
} 

हम देखते हैं कि स्काला में private[package] जावा में public हो जाता है। क्यूं कर? यह इस तथ्य से आता है कि जावा निजी पैकेज स्कैला निजी पैकेज के बराबर नहीं है। हालांकि ज्यादा यह यह कैसा दिखता

महत्वपूर्ण अंतर यह है कि 'निजी [mypackage]' स्काला में नहीं जावा पैकेज-निजी है, वहाँ एक अच्छा स्पष्टीकरण in this post है। स्कैला पैकेज वास्तव में पदानुक्रमित हैं, और 'निजी [mypackage]' अनुदान कक्षाओं और वस्तुओं तक पहुंच तक "mypackage" (सभी के बीच हो सकता है कि पदानुक्रमित पैकेज)। (मैं इस के लिए स्काला कल्पना संदर्भ नहीं है और मेरी समझ यहाँ धुंधला, मैं एक संदर्भ के रूप [4] का उपयोग कर रहा हूँ। हो सकता है) जावा के संकुल नहीं श्रेणीबद्ध हैं, और पैकेज-निजी अनुदान वर्गों के लिए केवल का उपयोग उस पैकेज में, साथ ही मूल वर्ग के उप-वर्गों के रूप में, स्कैला के 'निजी [mypackage]' की अनुमति नहीं है।

तो, 'पैकेज [mypackage]' जावा पैकेज-प्राइवेट दोनों से कम और कम प्रतिबंधित है। दोनों कारणों से, JVM पैकेज-प्राइवेट का उपयोग इसे लागू करने के लिए का उपयोग नहीं किया जा सकता है, और एकमात्र विकल्प जो स्केल संकलक में प्रकट होता है, वह 'सार्वजनिक' है।

+0

उत्तर के लिए धन्यवाद। क्या आपको नहीं लगता कि यह एपीआई लेखकों के लिए थोड़ा खतरनाक है? जिन कार्यक्षमताओं को वे कभी प्रकट नहीं करना चाहते थे वे जावा से स्पष्ट रूप से दिखाई देते हैं। मुझे आश्चर्य है कि क्या वे उपयोगकर्ता पर चेतावनी उत्पन्न करने के लिए कुछ एनोटेशन चाल का उपयोग कर सकते हैं जब वे एक सदस्य का उपयोग करने का प्रयास करते हैं जिसका उद्देश्य निजी – Dici

+0

@Dici है यदि आप जावा के साथ इंटरऑप करने की योजना बनाते हैं तो हाँ, मुझे निश्चित रूप से लगता है कि यह कुछ है जो आपको लेना है विचाराधीन, विशेष रूप से यदि यह आंतरिक रूप से खुलासा करता है तो आप नहीं चाहते कि ग्राहक आक्रमण करें। हालांकि इस विशेष मामले में, आप जनता को 'प्रसारण' भी कह सकते हैं।भाग्यशाली विधि, पैर में अपने आप को समान रूप से शूटिंग। –

+0

यूप, मेरा मतलब यह है कि अब मुझे पता है कि जावा एपीआई के माध्यम से सामने आने वाले सभी स्पार्क इंटर्नल्स को पैकेज-प्राइवेट के रूप में घोषित किया गया है, मुझे लगता है कि संभवत: अधिक जावा रैपर होना चाहिए जो कार्यात्मकताओं को छिपाने के लिए हो जो सार्वजनिक होने का इरादा नहीं था। मेरा उदाहरण सिर्फ यह दिखाने के लिए था कि विधि वास्तव में कहलाती थी। – Dici