سؤال

وهناك Void جافا - الكبير V-- <لأ href = "https://docs.oracle.com/javase/9/docs/api/java/lang/Void.html" يختلط = "noreferrer" > نوع مرجع . الموقف الوحيد رأيته كان عليه هو بالحدود Callables

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

هل هناك أي استخدامات أخرى للجافا نوع Void المرجعية؟ يمكن من أي وقت مضى أن تسند أي شيء آخر غير null؟ إذا كانت الإجابة بنعم، هل لديك أمثلة؟

هل كانت مفيدة؟

المحلول

لقد أصبحت Void اتفاقية لحجة العامة التي كنت لا ترغب في. لا يوجد أي سبب لماذا يجب عليك استخدام أي نوع آخر غير instantiable، مثل System.

وغالبا ما يستخدم أيضا في القيم سبيل المثال Map (على الرغم من Collections.newSetFromMap يستخدم Boolean كما الخرائط لم يكن لديك لقبول قيم null) وjava.security.PrivilegedAction.

وكتبت مدونة دخول على Void قبل بضع سنوات.

نصائح أخرى

ويمكنك إنشاء مثيل من انعكاسات استخدام الفراغ، ولكنها ليست مفيدة عن أي شيء. الفراغ هو وسيلة للإشارة إلى طريقة عامة ترجع شيء.

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

Future<Void> تعمل مثل السحر . :)

جميع فئات المجمع البدائية (Integer، Byte، Boolean، Double، الخ) تحتوي على إشارة إلى فئة بدائية المقابلة في حقل TYPE ثابت، على سبيل المثال:

Integer.TYPE == int.class
Byte.TYPE == byte.class
Boolean.TYPE == boolean.class
Double.TYPE == double.class
تم إنشاء

وVoid في البداية كمكان لوضع إشارة إلى نوع void:

Void.TYPE == void.class

ومع ذلك، كنت لا حقا كسب أي شيء باستخدام Void.TYPE. عند استخدام void.class انها أكثر وضوحا أنك تفعل شيئا مع نوع void.

وبوصفها جانبا، وآخر مرة حاولت ذلك، بيانشيل لم تعترف void.class، ولذلك عليك لاستخدام Void.TYPE هناك.

عند استخدام نمط الزوار في هذا الشأن يمكن أن تكون أكثر نظافة لاستخدام الفراغ بدلا من كائن عندما تريد أن تتأكد من أن ستكون قيمة الإرجاع باطل

مثال

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

   OUT visit(Leaf2 leaf);
}

عند ستنفذ زائرك يمكنك تعيين صراحة OUT أن يكون الفراغ حتى يتسنى لك معرفة زائرك سوف يعود دائما لاغيا، بدلا من استخدام كائن

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;
    }
}

وقبل الأدوية، تم إنشاؤه لAPI التفكير، لعقد نوع إرجاعها بواسطة Method.getReturnType () لطريقة باطلة، الموافق غيرها من الطبقات نوع بدائي.

وتحرير: من جافادوك من الفراغ: "إن الطبقة الفراغ هي فئة نائبا uninstantiable لعقد إشارة إلى كائن الفئة التي تمثل الفراغ الكلمة جافا". قبل الوراثة، وأنا على علم أي استخدام آخر من التفكير.

وكما تعلمون لا يمكن إنشاء مثيل الفراغ، يمكنك استخدام <لأ href = "https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/ObjectUtils .Null.html "يختلط =" نوفولو "> العموم أباتشي لاغية وجوه ، لذلك

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

وفي السطر الأول، لديك كائن، لذلك aNullObject != null يحمل، بينما في السطر الثاني هناك أي إشارة، لذلك يحمل noObjectHere == null

لإجابة سؤال على المرسل الأصلي، واستخدام لهذا هو التفريق بين "لا شيء" و "لا شيء"، والتي هي أشياء مختلفة تماما.

وPS: قل لا للنمط الكائن لاغية

والفراغ هو خلق التفاف البدائي نوع الفراغ لها. كل نوع بدائي وانها المقابلة نوع مرجع. يستخدم الفراغ إنشاء مثيل فئة عامة أو استخدام أسلوب عام، A الحجج العامة ساحرة كنت لا ترغب في. وهنا مثال ...

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> { .... } واجهة عامة لذلك أنا توفير الفراغ منذ الأدوية لا تقبل أنواع بدائية

وأيضا وهي تستخدم عادة في عمليات الاسترجاعات اكتمال التزامن-IO عندما لم يكن لديك الحاجة لكائن Attachment. في هذه الحالة عليك تحديد فارغة إلى العملية IO وتنفيذ CompletionHandler<Integer,Void>.

قد يكون حالة نادرة ولكن مرة واحدة، وأنا استخدم 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
         }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top