Применяется ли @ParametersAreNonnullByDefault и к возвращаемым значениям метода?

В документации для @ParametersAreNonnullByDefault говорится, что:

Эту аннотацию можно применить к пакету, классу или методу, чтобы указать, что параметры метода в этом элементе по умолчанию не равны нулю, если только...

Я не считаю возвращаемый тип/значение метода его параметром. Это только часть его подписи, поэтому для меня это неоднозначно.

руководство по методам Java, похоже, думает так же, как и я.


Как указал мне Иоахим Зауэр в разделе комментариев своего answer, имя @ParametersAreNonnullByDefault (параметры) должно было явно указал для меня, что эта аннотация не применяется к возвращаемым типам/значениям методов. Я был слеп! :) Спасибо Иоахим!

В свете этого я могу только сказать, что где-то должен существовать @EverythingIsNonnullByDefault. :)


person Kohányi Róbert    schedule 05.10.2011    source источник
comment
Итак, почему вы думаете, что эта аннотация будет применяться к возвращаемым значениям?   -  person David Z    schedule 05.10.2011
comment
У меня нет причин, почему он это сделал бы, вместо этого я хотел бы, чтобы он это делал. (См. мой комментарий к этому ответу. )   -  person Kohányi Róbert    schedule 05.10.2011


Ответы (2)


Я не вижу причин, по которым @ParametersAreNonnullByDefault следует применять к возвращаемым значениям.

person Joachim Sauer    schedule 05.10.2011
comment
Моя причина в том, что @Nonnull можно применять и к возвращаемым значениям метода. По крайней мере, документация для аннотации FindBugs @NonNull (что почти, если не то же самое, вещь как @Nonnull) говорит именно об этом. - person Kohányi Róbert; 05.10.2011
comment
@Psycho_Dad: да, вы указываете недействительность возвращаемого типа. Но это не означает, что эта аннотация по умолчанию влияет на нее, если вы ее не установите. - person Joachim Sauer; 05.10.2011
comment
Извините, но я не совсем вас понял. Мой вопрос заключался в том, применяется ли аннотация под рукой к возвращаемым значениям методов, если я ее установил. Мне все равно, что он делает, если я его не устанавливаю. :) - person Kohányi Róbert; 05.10.2011
comment
Под не устанавливайте его, я имел в виду не указывать явно @Nonnull@ или @Nullable в возвращаемом типе. - person Joachim Sauer; 05.10.2011
comment
Да, хорошо, но все же я хочу знать, что если я установлю @ParametersAreNonnullByDefault для класса, будет ли это неявно применяться аннотация @Nonnull к возвращаемым типам методов или нет. Потому что в моем чтении его применение так неявно применяет @Nonnull к параметрам метода. - person Kohányi Róbert; 05.10.2011
comment
@Psycho_Dad: с чего бы это? Возвращаемое значение не является параметром. В документации (и названии!) @ParametersAreNonnullByDefault четко указано, что это относится к параметрам. - person Joachim Sauer; 05.10.2011
comment
Хорошо, я понял наконец! :D Я не особо обратил внимание на название аннотации. Спасибо! - person Kohányi Róbert; 05.10.2011

Нет, @ParametersAreNonnullByDefault применяется только к параметрам метода — значениям, которые он принимает от вызывающего объекта (в скобках). Метод по-прежнему может возвращать значение null.

Вот класс, который объединяет все три места, где вы можете применить @Nonnull, хотя в нашем коде я все еще использую три отдельные аннотации, одна из которых предоставляется JSR-305.

package com.sample;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import javax.annotation.meta.TypeQualifierDefault;

/**
 * This annotation can be applied to a package, class or method to indicate that all
 * class fields and method parameters and return values in that element are nonnull 
 * by default unless overridden.
 */
@Documented
@Nonnull
@TypeQualifierDefault({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface EverythingIsNonnullByDefault {
}
person David Harkness    schedule 17.11.2012