জাভা অকার্যকর রেফারেন্স ধরণের জন্য ব্যবহার?


163

একটি জাভা রয়েছে Void- বড় হাতের ভি-- রেফারেন্স টাইপ । শুধুমাত্র অবস্থা আমি কখনো আছে দেখা এটি ব্যবহৃত parameterize হয় Callableগুলি

final Callable<Void> callable = new Callable<Void>() {
            public Void call() {
                foobar();
                return null;
            }
        };

জাভা Voidরেফারেন্স ধরণের জন্য অন্য কোন ব্যবহার আছে ? এটি কি কখনও ছাড়া অন্য কিছু বরাদ্দ করা যেতে পারে null? যদি হ্যাঁ, আপনার উদাহরণ আছে?



উত্তর:


116

Voidআপনি আগ্রহী নন এমন জেনেরিক যুক্তির জন্য কনভেনশন হয়ে গেছে you আপনার অন্য কোনও অ-অস্থায়ী প্রকার যেমন ব্যবহার করা উচিত তার কোনও কারণ নেই System

এটা প্রায়ই উদাহরণস্বরূপ ব্যবহার করা হয় Mapমান (যদিও Collections.newSetFromMapব্যবহারসমূহ Booleanমানচিত্র গ্রহণ করতে হবে না nullমান) এবং java.security.PrivilegedAction

আমি লিখেছেন ওয়েব্লগ এন্ট্রি উপর Voidকয়েক বছর ফিরে।


কে এই সম্মেলন করেছে? দস্তাবেজগুলির রাজ্যে ডকস.অরাকল.com/জ্যাভেস / টিউটোরিয়াল / জাভা / জেনারিক্স / টাইপস html "প্যারামিটারের নামকরণ কনভেনশনগুলি টাইপ করুন কনভেনশন অনুসারে, প্যারামিটারের নামগুলি একক, বড় হাতের অক্ষর।"
বারলপ

4
@ বারলপ এটি যুক্তিটি প্যারামিটারের নাম নয়। যে, এটি টাইপ java.lang.Void। / জোশ ব্লচ কনভেনশনকে জনপ্রিয় করেছেন, যদিও আপনি একবার এটি দেখে ফেলেছেন, এটি সুস্পষ্ট পছন্দ।
টম হাটিন -

2
ব্লগের এন্ট্রিটি মারা গেছে
এমফিনস্টাইন

51

আপনি প্রতিফলন ব্যবহার করে শূন্যতার উদাহরণ তৈরি করতে পারেন, তবে সেগুলি কোনও কিছুর জন্য কার্যকর নয়। অকার্যকর হ'ল জেনেরিক পদ্ধতিটি কিছুই দেয় না তা নির্দেশ করার উপায় is

Constructor<Void> constructor = Void.class.getDeclaredConstructor();
constructor.setAccessible(true);
Void v = constructor.newInstance();
System.out.println("I have a " + v);

কিছু মুদ্রণ

I have a java.lang.Void@75636731

22
ডকুমেন্টেশন বলে যে শ্রেণিটি ইনস্ট্যান্ট করার জন্য +1 অবিশ্বাস্য। আমি এটিও করেছি এবং আমি স্বীকার করি যে ইনস্ট্যান্টেটেড ভয়েডগুলি অকেজো।
লুক উডওয়ার্ড

1
কনস্ট্রাক্টর <ভাইয়েড> সিভি = ভয়েড.ক্লাস.সেটডেক্লেয়ারড কনস্ট্রাক্টর (); cv.setAccessible (সত্য); অকার্যকর v = cv.newInstance (); System.out.println (উ); //;)
পিটার লরে

অনুশীলন হিসাবে, প্রতিচ্ছবি ব্যবহার করে একটি নতুন ক্লাস তৈরি করার চেষ্টা করুন এবং দেখুন কী ঘটে।
পিটার লরে

আমি sun.reflect.InstantiationExceptionConstructorAccessorImpl থেকে একটি java.lang.InstantiationException পেয়েছি। :(
লুক উডওয়ার্ড

7
এটি বাস্তবায়নের জন্য নির্দিষ্ট এবং যে কোনও সময় পরিবর্তন হতে পারে change কোনও গ্যারান্টি নেই যে ক্লাসটির একটি নো-আরগ কনস্ট্রাক্টর রয়েছে এবং এমনকি যদি এটির কিছু থাকে যা সম্ভবত কিছু করতে পারে (সম্ভবত System.exit(0))। আমি যেমন কনস্ট্রাক্টরের সাথে ইউটিলিটি ক্লাস লিখি private Void() { throw new Error(); }। কেউ কেউ কোনও মূল্যমান এনাম পছন্দ করতে পারে।
টম হাটিন -

27

Future<Void>কবজ মত কাজ করে। :)


6
এটি ব্যবহার করা আরও সাধারণ (উদাহরণস্বরূপ, পেয়ারাতে) Future<?>যেমন ভবিষ্যতে প্রায়শই একটি বৈধ মান (অ- Voidধরণের) থাকে তবে এটি এমন প্রসঙ্গে ব্যবহৃত হয় যা মানটির যত্ন নেয় না।
ডেভিড ফিলিপস

1
CompletableFuture<Void>মোহন মত কাজ করে।
andrybak

19

কোনও পাবলিক কনস্ট্রাক্টর নেই বলে প্রদত্ত , আমি বলব এটি ছাড়া আর কিছু বরাদ্দ করা যাবে না null। আপনার উদাহরণটি দেখায় আমি কেবল এটির স্থানধারক হিসাবে "এই জেনেরিক প্যারামিটারটি ব্যবহার করার দরকার নেই" হিসাবে ব্যবহার করেছি।

এটি জাভাডোক যা বলে তা থেকে এটি প্রতিবিম্বেও ব্যবহার করা যেতে পারে :

শূন্য শ্রেণিটি জাভা কীওয়ার্ড শূন্যতার প্রতিনিধিত্ব করে শ্রেণি অবজেক্টের একটি রেফারেন্স ধরে রাখার জন্য একটি অদম্য স্থানধারক শ্রেণি।


ওরাকল / সান এটিকে বর্ণনা করে দেখার মতো যথেষ্ট মজাদার কারণ শূন্যতা সব ধরণের উদাহরণ। যাইহোক, যেমন আপনি বলেছেন, এর শুদ্ধ অর্থ হ'ল "আমি এখানে যে কোনও ধরণের লিখতে পারি কারণ এতে আমি আগ্রহী নই, সুতরাং আমার কোডটি পড়া লোকেরা ঠিক এটি বুঝতে পারে তা নিশ্চিত করার জন্য আমি
ভয়েডকে রেখে দেব

17

সকল আদিম রাপার শ্রেনীর ( Integer, Byte, Boolean, Double, ইত্যাদি) একটি স্ট্যাটিক সংশ্লিষ্ট আদিম বর্গ একটি রেফারেন্স ধারণ TYPEউদাহরণস্বরূপ ক্ষেত্র:

Integer.TYPE == int.class
Byte.TYPE == byte.class
Boolean.TYPE == boolean.class
Double.TYPE == double.class

Voidvoidপ্রকারের রেফারেন্স দেওয়ার জন্য প্রথমদিকে এটি তৈরি করা হয়েছিল :

Void.TYPE == void.class

তবে, আপনি ব্যবহার করে সত্যই কিছু অর্জন করতে পারেন না Void.TYPE। আপনি যখন ব্যবহার করেন void.classএটি আরও পরিষ্কার হয় যে আপনি voidধরণের সাথে কিছু করছেন ।

একদিকে যেমন, সর্বশেষে আমি চেষ্টা করেছিলাম, বিনশেল চিনতে পারেনি void.class, তাই আপনাকে Void.TYPEসেখানে ব্যবহার করতে হবে।


8
সুতরাং একটি Void.class এবং একটি void.class উভয় আছে!
টম অ্যান্ডারসন

8

আপনি যখন ভিজিটর প্যাটার্নটি ব্যবহার করেন তখন প্রত্যাবর্তনের মানটি বাতিল হয়ে যাবে তা নিশ্চিত করতে চাইলে অবজেক্টের পরিবর্তে অকার্যকরটি ব্যবহার করা পরিষ্কার হতে পারে

উদাহরণ

public interface LeavesVisitor<OUT>
{
   OUT visit(Leaf1 leaf);

   OUT visit(Leaf2 leaf);
}

আপনি যখন আপনার ভিজিটরকে বাস্তবায়ন করবেন আপনি পরিষ্কারভাবে আউটটিকে শূন্য বলে সেট করতে পারবেন যাতে আপনি জানেন যে অবজেক্ট ব্যবহার না করে আপনার দর্শক সর্বদা নালায় ফিরে আসবে

public class MyVoidVisitor implements LeavesVisitor<Void>
{
    Void visit(Leaf1 leaf){
        //...do what you want on your leaf
        return null;
    }

    Void visit(Leaf2 leaf){
        //...do what you want on your leaf
        return null;
    }
}

5

জেনারিকের আগে, এটি অন্যান্য আদিম ধরণের শ্রেণীর সাথে মিলে একটি শূন্য পদ্ধতির জন্য মেথড.জেটআটারনটাইপ () দ্বারা ফেরত টিওয়াইপি রাখার জন্য এটি প্রতিবিম্ব এপিআইয়ের জন্য তৈরি করা হয়েছিল।

সম্পাদনা: জাভাস্ক অফ ভয়েড থেকে: "জাভা কীওয়ার্ড শূন্যতার প্রতিনিধিত্ব করে ক্লাস অবজেক্টের একটি রেফারেন্স ধরে রাখার জন্য শূন্য শ্রেণিটি একটি অনিবার্য স্থানধারক শ্রেণি"। জেনারিক্সের আগে, আমি প্রতিবিম্ব ছাড়া অন্য কোনও ব্যবহার সম্পর্কে সচেতন।


আমি এটা বিশ্বাস করি না। আমার কাছে এখন আমার সামনে 1.4 বা তার আগের জেভিএম নেই, তবে আমি বিশ্বাস করি যে মেথড.জেটআটারনটাইপ () সর্বদা একটি শূন্য পদ্ধতির জন্য শূন্যপদে ফিরে এসেছে।
লুক উডওয়ার্ড

@ পেয়ার: আমি বলছি যে জেনেরিক্সের আগে , আমি কেবলমাত্র ব্যবহার সম্পর্কে সচেতন তা হ'ল টিওয়াইপি (ভয়েড.টিওয়াইপি'র মতো) রাখা, যা একটি শূন্য পদ্ধতির জন্য প্রতিবিম্বের মেথড.জেট রিটারনটাইপ () ব্যবহার করা হত।
লরেন্স ডল

এটি একরকম ফিরে আসে না Void। দয়া করে দেখুন stackoverflow.com/questions/34248693/...
আলিরেজা Fattahi

3

হিসাবে আপনি instantiate বিফল না করতে পারেন, আপনি ব্যবহার করতে পারেন এ্যাপাচি কমন্স নাল বস্তুর , তাই

Null aNullObject = ObjectUtils.Null;
Null noObjectHere = null;

প্রথম লাইনে আপনার একটি অবজেক্ট aNullObject != nullরয়েছে তাই ধরে রেখেছে, যখন দ্বিতীয় লাইনে কোনও রেফারেন্স নেই, তাই noObjectHere == nullহোল্ড করে

পোস্টারের মূল প্রশ্নের উত্তর দিতে, এর ব্যবহার হ'ল "কিছুই না" এবং "কিছুই নয়" এর মধ্যে পার্থক্য করা, যা সম্পূর্ণ আলাদা জিনিস।

PS: নাল অবজেক্ট প্যাটার্নটিকে বলুন না


1

শূন্যস্থান তার আদিম শূন্য প্রকারটি মোড়ানোর জন্য তৈরি করা হয়। প্রতিটি আদিম ধরণের এর সাথে সম্পর্কিত রেফারেন্স টাইপ থাকে। অকার্যকর জেনেরিক ক্লাস ইনস্ট্যান্ট করতে বা জেনেরিক পদ্ধতির ব্যবহার করতে ব্যবহৃত হয়, একটি জেনেরিক আর্গুমেন্ট যা আপনার আগ্রহী নয় ডাইনি and এবং এখানে একটি উদাহরণ ...

public void onNewRegistration() {
    newRegistrationService.createNewUser(view.getUsername(), view.getPassword(),
            view.getInitialAmount(), view.getCurrency(), new AsyncCallback<Void>() {
      @Override
      public void onFailure(Throwable caught) {

      }

      @Override
      public void onSuccess(Void result) {
        eventBus.fireEvent(new NewRegistrationSuccessEvent());
      }
    });
  } 

এখানে যেমন আপনি দেখতে পাচ্ছেন, আমি সার্ভার থেকে এমন কিছু চাই না যা আমি একটি নতুন রেজিস্ট্রেশন তৈরি করতে বলছি, তবে public interface AsyncCallback<T> { .... }একটি জেনেরিক ইন্টারফেস তাই আমি শূন্যতা সরবরাহ করি যেহেতু জেনারিকরা আদিম ধরণের গ্রহণ করে না


0

যখন আপনার কোনও প্রয়োজনের প্রয়োজন হয় না তখন এটি সাধারণত অ্যাসিঙ্ক-আইও সমাপ্তি কলব্যাকগুলিতে ব্যবহৃত হয় Attachment। সেক্ষেত্রে আপনি আইও অপারেশনটি বাতিল করতে পারবেন এবং প্রয়োগ করবেন CompletionHandler<Integer,Void>


0

এটি বিরল ক্ষেত্রে হতে পারে তবে একবার, আমি Voidদিক ক্লাসে ব্যবহার করেছি ।

এটি এমন একটি দিক ছিল যা টীকাবিহীন পদ্ধতিগুলির পরে চলতে @Logথাকে এবং পদ্ধতিটি ফিরে আসার পদ্ধতিটি বাতিল করে দেয় এবং পদ্ধতিটি ফেরতের ধরনটি বাতিল না হলে কিছু তথ্য লগ করে।

 @AfterReturning(value = "@annotation(log)", 
       returning = "returnValue", 
       argNames = "joinPoint, log, returnValue"
      )
    public void afterReturning(final JoinPoint joinPoint, final Log log,
            final Object returnValue) {

            Class<?> returnType = ((MethodSignature) joinPoint.getSignature())
            .getReturnType();
           if (Void.class.isAssignableFrom (returnType)) ) {
            //Do some log
         }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.