Использует для ссылочного типа Java Void?



есть Java Void -- прописные буквы V-- ссылка типа. Единственная ситуация, которую я когда-либо видел, это параметризация Callables



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


есть ли другие варианты использования Java Void ссылочный тип? Может ли он когда-либо быть назначен что-либо, кроме null? Если да, то есть ли у вас примеры?

528   11  

11 ответов:

Void стало соглашением для общего аргумента, который вас не интересует. Нет никаких причин, почему вы должны использовать любые другие номера-инстанцируемая типа, таких как System.

он также часто используется, например,Map значения (хотя Collections.newSetFromMap использует Boolean как карты не должны принимать null значение) и java.security.PrivilegedAction.

я написал запись в блог on Void несколько лет назад.

вы можете создать экземпляр Void с помощью отражений, но они не полезны ни для чего. 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. Я только использовал его в качестве заполнителя для "Мне не нужно использовать этот общий параметр", как показывает ваш пример.

Он также может быть использован в размышления, от чего его документация говорит:

Void класс является uninstantiable класс заполнитель для хранения ссылки на объект класса, представляющего слово Java пустота.

все примитивные классы-оболочки (Integer,Byte,Boolean,Double и т. д.) содержать ссылку на соответствующий примитивный класс в статическом

при использовании шаблон Visitor это может быть чище, чтобы использовать Void вместо объекта, когда вы хотите быть уверены, что возвращаемое значение будет null

пример

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

   OUT visit(Leaf2 leaf);
}

когда вы реализуете своего посетителя, вы можете явно указать, что он недействителен, чтобы вы знали, что ваш посетитель всегда будет возвращать null, а не использовать Object

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 отражения, чтобы удерживать тип, возвращаемый методом.getReturnType () для метода void, соответствующего другим классам примитивных типов.

EDIT: из JavaDoc Void:"класс Void является неинсталлируемым классом-заполнителем для хранения ссылки на объект класса, представляющий ключевое слово Java void". До дженериков я не знаю никакой пользы, кроме отражения.

поскольку вы не можете создать экземпляр Void, вы можете использовать Apache commons Null object, так что

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

в первой строке, у вас есть объект, так aNullObject != null держит, а во второй строке нет ссылки, так noObjectHere == null держит

чтобы ответить на исходный вопрос плаката, использование для этого заключается в том, чтобы различать "ничто" и "ничто", которые являются совершенно разными вещами.

PS: Скажите " нет " нулевому объектному шаблону

Void-это создать, чтобы обернуть его примитивный тип void. Каждый примитивный тип имеет соответствующий ссылочный тип. Void используется для создания экземпляра универсального класса или использования универсального метода, универсальных аргументов, которые вас не интересуют. и вот вам пример ...

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> { .... } является общим интерфейсом, поэтому я предоставляю 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
         }
}

Comments

    Ничего не найдено.