In object-oriented programming languages, a method on an object
that sets a property of that object. Mutators are the simplest
example of a setter method, which explicitly assign the value of the
parameter to a given field or data member.
However, other types of setter method are possible. One example is a
setter method that performs validation before assignment. If the
parameter passed is not a legal value for the particular property,
the method may choose to log an error or throw an exception. In
circumstances where fail fast behavior is inappropriate, parameters
that are out of bounds may alternatively be clipped to a valid range.
Setter methods can also be written to incorporate side effects. An
application with a database back-end may wish to maintain
data integrity by updating the corresponding record whenever a setter
method is called. One common application of AOP is to intercept every setter
and wrap the call within a database transaction.
Another common variant of the setter method uses synthesis.
Systems such as JavaBeans or scripting languages use the existence of
getter and setter methods to deduce the existence of a
property. An interface specification may require a particular setter,
but the underlying object has no such data member. In these cases, the
property is synthesized by calculating and assigning to different members
of the object.
In many ways, setter methods are among the triumphs of
coding standards over common sense. Their implementation ranges from
tediously trivial automatic code generation of mutators by an IDE,
to fiddly database update statements or thread-safe structure
manipulation. There's surely something wrong when the
right thing to do is to write
public void setBalance(double balance)
{
this.balance = balance;
}
so an
ECMAScript writer can use
account.balance = 0.0;
even though that's probably what you'd rather have written in the
first place? However, setter methods do have some advantages,
particularly in newer
paradigms such as
dependency injection.