2017-05-05 4 views
6

मैं जानना चाहता हूं कि किसी विशेष प्रकार की मनमानी वस्तु के उदाहरण विधि का संदर्भ क्रमिक है या नहीं?जावा 8 में एक आवृत्ति विधि serializable के संदर्भ में है?

उदाहरण:

public class MyClass { 
    public void foo() { 
     System.out.println("Serializable"); 
    } 
} 

SerializableConsumer

@FunctionalInterface 
public interface SerializableConsumer<T> extends Consumer<T>, Serializable { 
} 

और क्षेत्र है:

SerializableConsumer<MyClass> serializableMethod = MyClass::foo; 

संपादित

+1

आप उस विशेष प्रकार के विधि संदर्भ के बारे में क्यों पूछ रहे हैं? क्या आपको लगता है, यह अन्य विधि संदर्भों या लैम्ब्डा अभिव्यक्तियों की तुलना में विशेष है? – Holger

+0

मेरा मानना ​​है कि आपका प्रश्न विचार के लिए अच्छी सामग्री है, इसलिए मैंने इसे ऊपर उठाया। हालांकि, मैं आपके उपयोग के मामले के बारे में उत्सुक हूं ... आपको विधि संदर्भ को क्रमबद्ध करने की आवश्यकता क्यों है? –

+0

यह वार्तालाप के दायरे के साथ सीडीआई बीन का क्षेत्र है। तो यह serializable होना चाहिए। – Saljack

उत्तर

5

यह मानते हुए कि SerializableFunction एक प्रकार है कि Serializable फैली को संदर्भित करता है, विधि संदर्भ serializable हो जाएगा। आपके द्वारा पूछे जा रहे विशिष्ट प्रकार के विधि संदर्भ के बारे में कुछ खास नहीं है।

सबसे विशेष रूप से, "एक मनमाना वस्तु का एक उदाहरण विधि के संदर्भ में" MyClass के किसी भी मामले पर कब्जा नहीं कर रहा है, इसलिए, तथ्य यह है कि MyClassSerializable नहीं है नहीं महत्वपूर्ण है। यदि आप object::foo जैसे किसी विशेष उदाहरण की एक उदाहरण विधि का जिक्र कर रहे थे, तो यह अलग होगा, क्योंकि उस स्थिति में ऑब्जेक्ट को क्रमबद्ध किया जाना था, जो रनटाइम पर विफल हो जाएगा, अगर इसकी कक्षा Serializable लागू नहीं करती है।

काम नहीं करेगा, void विधि को के रूप में Void के रूप में संदर्भित करना है। मुझे नहीं पता कि आपके SerializableFunction<MyClass, Void> को परिभाषित किया गया है, लेकिन यदि यह Function<MyClass, Void>&Serializable के बराबर है, तो यह काम नहीं करेगा।

import java.io.*; 
import java.util.function.Consumer; 

public class MyClass { 
    public void foo() { 
     System.out.println("Serializable"); 
    } 
    public static void main(String[] args) throws IOException, ClassNotFoundException { 
     Consumer<MyClass> consumer = (Consumer<MyClass>&Serializable)MyClass::foo; 

     byte[] serialized; 
     try(ByteArrayOutputStream baos=new ByteArrayOutputStream(); 
      ObjectOutputStream oos = new ObjectOutputStream(baos)) { 
      oos.writeObject(consumer); 
      oos.flush(); 
      serialized=baos.toByteArray(); 
     } 

     Consumer<MyClass> deserialized; 
     try(ByteArrayInputStream bais=new ByteArrayInputStream(serialized); 
      ObjectInputStream ois=new ObjectInputStream(bais)) { 
      deserialized = (Consumer<MyClass>)ois.readObject(); 
     } 

     deserialized.accept(new MyClass()); 
    } 
} 

के रूप में कहा, एक विशिष्ट उदाहरण के लिए संदर्भ, लक्ष्य उदाहरण क्रमानुसार करने के लिए है, इसलिए इस बात का serializability पर निर्भर करते हैं:

आप एक उचित कार्यात्मक इंटरफ़ेस है, तो विधि संदर्भ serializing कोई समस्या नहीं है उदाहरण तो

import java.io.*; 
import java.util.function.Consumer; 

public class MyClass { 
    public void foo() { 
     System.out.println("Serializable"); 
    } 
    public static void main(String[] args) throws IOException, ClassNotFoundException { 
     Runnable runnable = (Runnable&Serializable)new MyClass()::foo; 

     byte[] serialized; 
     try(ByteArrayOutputStream baos=new ByteArrayOutputStream(); 
      ObjectOutputStream oos = new ObjectOutputStream(baos)) { 
      oos.writeObject(runnable); 
      oos.flush(); 
      serialized=baos.toByteArray(); 
     } 

     Runnable deserialized; 
     try(ByteArrayInputStream bais=new ByteArrayInputStream(serialized); 
      ObjectInputStream ois=new ObjectInputStream(bais)) { 
      deserialized = (Runnable)ois.readObject(); 
     } 

     deserialized.run(); 
    } 
} 

, एक java.io.NotSerializableException: MyClass साथ कार्यावधि में असफल जब तक आप MyClass बदलने Serializable लागू करने के लिए होगा।

+0

आपके उत्तर के लिए धन्यवाद।SerializableFunction इंटरफ़ेस है जो Serializable बढ़ाता है। मेरा वास्तविक रिटर्न प्रकार इंटीजर है इसलिए यह मेरी गलती है। – Saljack

0

मैं तुम्हें पता है एक लैम्ब्डा एक्सप्रेशन को क्रमबद्ध कर सकते हैं (जैसा कि आप here देख सकते हैं)

अब, आप जो करना चाहते हैं वह केवल वैरिएबल को ही क्रमबद्ध कर सकता है? या विधि? ... मुझे नहीं पता क्यों, लेकिन मुझे नहीं लगता कि आप कर सकते हैं। हो सकता है कि आप एक लैम्ब्डा बनाता है की तरह, दूसरी तरह के लिए जाना है और इसे क्रमानुसार, ऊपर पोस्ट में की तरह कर सकते हैं:

Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!"); 
+3

स्थैतिक चर * नहीं * क्रमबद्ध हैं। शायद आपको जो लिखा है उसे पढ़ना चाहिए ... – Holger

+0

हाहाहा हाहा मैं एक डंक हूं, बहुत बहुत धन्यवाद ... मुझे समझ में आता है! –

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