Re: use of setter and getter methods
Eric Sosman wrote:
private int value;
public void setValue(int value) {
assert value >= 0;
this.value = value;
}
While generally I agree with your advice, assertions are not meant to be used
this way. Asserts are for the enforcement of program invariants and belong in
private methods, not as value checkers for public methods. In the cited
example, one should use an if test and throw an exception such as NPE or
IllegalArgumentException.
In the second place, assertions throw an Error, not an Exception. How is a
client supposed to handle that? Remember,
<http://java.sun.com/javase/6/docs/api/java/lang/Error.html>
An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch.
In the third place, assertions typically are disabled in production, which
loses your method its ability to check argument values.
<http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10>
Typically, assertion-checking is enabled during program development and testing, and disabled for deployment, to improve performance.
Because assertions may be disabled, programs must not assume that the expressions contained in assertions will be evaluated. Thus, these boolean expressions should generally be free of side effects:
Evaluating such a boolean expression should not affect any state that is visible after the evaluation is complete. It is not illegal for a boolean expression contained in an assertion to have a side effect, but it is generally inappropriate, as it could cause program behavior to vary depending on whether assertions were enabled or disabled.
Along similar lines, assertions should not be used for argument-checking in public methods. Argument-checking is typically part of the contract of a method, and this contract must be upheld whether assertions are enabled or disabled.
But really, that all falls out from the fact that the 'assert' keyword is
designed to enforce /assertions/, not bounds checks and other runtime checks
that are not assertions.
--
Lew