Я читал о «контракте класса» на Ее, и все, кажется, указывают, что это только для public свойств и методов. Так ли это?
Я думаю, что контракт класса не ограничивается только общедоступным интерфейсом, но также и частными методами и полями. Таким образом, в большинстве случаев поведение метода - его модификатор доступа, тип возвращаемого значения и выброшенное исключение - находится в соответствии с контрактом.
Например, следующий метод:
private String returnString() все еще находится в соответствии с контрактом, согласно которому он вернет String. Я ошибся?
Клиенты не заботятся (и не должны) о приватных методах.
@RobOhRob не является возвращаемым типом методов, а выброшенное исключение подпадает под действие контракта? Например, класс гарантирует, что метод вернет только тип String и вызовет только некоторое исключение. это не договор?




private методы не раскрываются и поэтому не могут быть частью какого-либо контракта public.
Класс, который придерживается контракта (например, через интерфейс), гарантирует, что он будет предоставлять определенные public методы, а иногда и поля нижестоящему потребителю. Как происходит выполнение этого контракта, является деталью реализации, часто выполняемой с помощью частных методов.
Разве методы возвращаемого типа и выброшенное исключение не подпадают под действие контракта? Например, класс гарантирует, что метод вернет только тип String и выдаст только some Exception. это не договор?
Можно добавить, что в дополнение к сигнатуре метода (проверяемой компилятором) дополнительно должны выполняться определенные пре-, пост-условия и инварианты (задокументированные в java-документе/спецификации и применяемые программистом реализации). Например. что метод List<T> sort(List<T> items) вернет не только List<T>, но и этот список будет отсортирован.
@lynxx: возвращаемый тип не является частью формальной подписи метода. Кроме того, вы все еще ссылаетесь на частные методы. Вот аналогия: предположим, вы пошли пообедать с друзьями и хотите заплатить за свою порцию. публичный, с которой сталкивается часть этого контракта, заключается в том, что вы будете платить. Как, который вы платите, является деталью реализации; вы могли вытащить наличные деньги или карту или PayPal кому-то еще за столом. На публике вы платите за еду. В частном порядке вы определяете, откуда берутся средства. Договор об оплате вашего обеда не нарушается, если вы используете наличные вместо карты или PayPal.
@Makoto Я не говорю о частных методах. Для этого метода public String getName() Мы можем гарантировать, что возвращаемый тип будет String. Могу ли я сказать, что метод по контракту будет возвращать только String? Итак, термины guarantee и contract отличаются в этом контексте?
@lynxx: Не... обязательно. Нет, если только это не было действительно применимо во время компиляции (например, через интерфейс или абстрактный класс), поскольку возвращаемый тип метода - нет часть подписи метода. Вы можете заявить, что существует подразумеваемый контракт, который getName вернет String, но мало кто так делает; это больше о том, что getName на самом деле вернется. Возвращает ли это имя? В общем и целом? Полное имя? Те являются более важными деталями контракта.
Он будет возвращать только строку внутри класса, где этот метод определен, потому что он является закрытым... Контракт - это больше того, что видно/доступно для внешнего мира.