2014-01-23 2 views
2

Я использую рамки проверки и аннотации типов, чтобы проверить правильность использования @Nullable и @NonNull. В классе Map-like спецификация Java заявляет, что get(…) -methods возвращает null, когда карта не содержит записи для этого ключа. Поэтому методы имеют @Nullable -нотацию. Однако, когда contains(…) возвращает true, я хотел бы гарантировать, что get(…) не вернется null.@EnsuresNonNullIf аннотация дает «условное постусловие не выполнено» -warning

Как я могу указать условное NonNull?

Насколько я знаю, вы можете достичь этого аннотирования contains(…) -методов с @EnsuresNonNullIf, следующим образом:

@Pure 
@EnsuresNonNullIf(expression = {"get(#1)", "getMatchingStoredKey(#1)", "getStrict(#1)", "lookup(#1)"}, result = true) 
public boolean containsKeyStrict(final @Nullable Class<? extends TKeyClass> key) { 
    return super.containsKey(key); 
} 

@Pure 
public @Nullable TValue getStrict(final @Nullable Class<? extends TKeyClass> key) { 
    Return super. gets (key); 
} 

Однако, это вызывает предупреждение:

the conditional postcondition about 'this.getStrict(key)' at this return statement is not satisfied 

Как я должен решить это «постусловие не удовлетворено» - предупреждение?

Моя среда:

  • Maven: 3.0.4
  • Java: 1.7.0_25 (Oracle)
  • Checker рамки 1.7.0 (через Maven плагин)

This Gist демонстрирует проблема.


1) Он расширяет функциональность объекта, чтобы извлекать записи с помощью «похожих» ключей.

ответ

0

До сих пор мое единственное решение - объединить @EnsuresNonNullIf -номену с SuppersWarnings("nullness"). Например .:

@SuppressWarnings("nullness") 
@EnsuresNonNullIf(expression = {"get(#1)", "getMatchingStoredKey(#1)", "getStrict(#1)", "lookup(#1)"}, result = true) 
public boolean containsKeyStrict(final @Nullable Class<? extends TKeyClass> key) { 
    return super.containsKey(key); 
} 

Для определения области @SuppressWarnings вы можете делегировать реализацию в метод, не аннотированный @EnsuresNonNullIf.

0

Когда вы говорите

спецификация состояния Java, которые получают (...) -методов возвращают нуль, когда карта не содержит запись для ключа

вы правы, но лишь отчасти, check here, в Javadoc состояния,

Если эта карта позволяет нулевые значения, то возвращаемое значение NULL не обязательно указывают, что карта не содержит отображения для ключа; также возможно, что карта явно отображает ключ в значение null. containsKey-операция может использоваться для различения этих двух случаев.

это означает, что, если вы картирование ключа к нулевому значению, ваш метод containsKeyStrict может вернуться true и до сих пор, ваш метод getStrict вернется null, не потому, что нет никакого значения для этого ключа, но потому, что значение этот ключ точно равен null.

Для применения такого поведения вам нужно, вы можете использовать HashTable, которая не позволяет нулевые значения (или ключей), или вы можете добавить валидаций к put методов, чтобы предотвратить вставку null значений в вашу карту, удачи.

+0

Истина, карта допускает нулевые значения. Тем не менее, checkerframework считает тип значения как '@ Nonnull' по умолчанию, поэтому структура должна вывести - если он здесь что-то видит - что аннотация' @ EnsuresNonNullIf' правильная. Эксперимент с полем, метод setToNullNull() и метод get() ', вызвали одно и то же предупреждение (возможно, я должен опубликовать этот эксперимент). Чтобы уточнить, мой вопрос заключается в том, как я могу сказать checkerframework «доверься мне, я говорю правду»? –

 Смежные вопросы

  • Нет связанных вопросов^_^