سؤال
وهناك Void
جافا - الكبير V-- <لأ href = "https://docs.oracle.com/javase/9/docs/api/java/lang/Void.html" يختلط = "noreferrer" > نوع مرجع . الموقف الوحيد رأيته كان عليه هو بالحدود Callable
s
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>
تعمل مثل السحر . :)
وبالنظر إلى أن هناك لا المنشئات العامة أ >، أود أن أقول أنه لا يمكن تعيين أي شيء آخر غير null
. لقد استعملت فقط على أنها نائبا ل "أنا لا تحتاج إلى استخدام هذه المعلمة العامة"، كما يوضح المثال الخاص بك.
ويمكن أيضا أن تستخدم في التفكير، من ما لها <لأ href = "http://java.sun.com/javase/6/docs/api/java/lang/Void.html" يختلط = "noreferrer" > جافادوك يقول:
<اقتباس فقرة>والطبقة الفراغ هي فئة نائبا uninstantiable لعقد إشارة إلى كائن الفئة التي تمثل الفراغ الكلمة جافا.
اقتباس فقرة> جميع فئات المجمع البدائية (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
}
}