Ответ 1
Я бы использовал ключевое слово Java assert
в самом методе для кодирования постусловия.
Unit Test или постусловие?
Единичные тесты и постусловия служат различным целям.
Утверждение в unit test обеспечивает проверку результата метода для одного входного вектора. Это оракул, определяющий ожидаемый результат для одного конкретного случая.
An assert
в самом методе проверяет, что для любого ввода выполняется постусловие. Это оракул, определяющий (свойства) ожидаемый результат для всех возможных случаев.
Такое postcondition-as-oracle хорошо сочетается с автоматизированными методами тестирования, в которых легко создавать входы, но трудно генерировать ожидаемое значение для каждого входа.
Постусловия Guava?
Что касается того, что у Guava есть класс Precondition, но нет класса Postcondition, здесь мое понимание.
Предварительные условия Guava эффективно предоставляют ряд сокращений для обычных ситуаций, в которых вы хотели бы бросить конкретный вид исключения (недопустимый аргумент, нулевой указатель, индекс за пределами границ, незаконное состояние) на основе входов метода или объекта состояние.
Для постусловий таких распространенных случаев меньше. Следовательно, меньше необходимости предоставлять стенографию, бросающую определенные виды исключений. Неудачное постусловие похоже на HTTP 500 "Внутренняя ошибка сервера" - все мы знаем, что что-то пошло не так, выполняя наш метод.
(Обратите внимание, что предположение Guava о предварительном условии сильно отличается от представления о конструировании по контракту, в котором нет никаких гарантий, если предварительное условие не является met - даже не исключено разумное исключение. Класс Guava Preconditions предоставляет полезные возможности, чтобы сделать публичный API более защищенным).