Notes on Set and Get Methods
As you know, a class's private fields can be manipulated only by methods of that class. A typical manipulation might be the adjustment of a customer's bank balance (e.g., a private instance variable of a class BankAccount) by a method computeInterest. Classes often provide public methods to allow clients of the class to set (i.e., assign values to) or get (i.e., obtain the values of) private instance variables.
As a naming example, a method that sets instance variable interestRate would typically be named setInterestRate and a method that gets the interestRate would typically be called getInterestRate. Set methods are also commonly called mutator methods, because they typically change a value. Get methods are also commonly called accessor methods or query methods.
Set and Get Methods vs. public Data
It would seem that providing set and get capabilities is essentially the same as making the instance variables public. This is a subtlety of Java that makes the language so desirable for software engineering. A public instance variable can be read or written by any method that has a reference to an object that contains the instance variable. If an instance variable is declared private, a public get method certainly allows other methods to access the variable, but the get method can control how the client can access the variable. For example, a get method might control the format of the data it returns and thus shield the client code from the actual data representation. A public set method canand shouldcarefully scrutinize attempts to modify the variable's value to ensure that the new value is appropriate for that data item. For example, an attempt to set the day of the month to 37 would be rejected, an attempt to set a person's weight to a negative value would be rejected, and so on. Thus, although set and get methods provide access to private data, the access is restricted by the programmer's implementation of the methods. This helps promote good software engineering.
Validity Checking in Set Methods
The benefits of data integrity are not automatic simply because instance variables are declared privatethe programmer must provide validity checking. Java enables programmers to design better programs in a convenient manner. A class's set methods can return values indicating that attempts were made to assign invalid data to objects of the class. A client of the class can test the return value of a set method to determine whether the client's attempt to modify the object was successful and to take appropriate action. In Chapter 13, Exception Handling, we demonstrate how clients of a class can be notified when an attempt is made to modify an object with an inappropriate value.
Software Engineering Observation 8.7
When necessary, provide public methods to change and retrieve the values of private instance variables. This architecture helps hide the implementation of a class from its clients, which improves program modifiability. |
Software Engineering Observation 8.8
Class designers need not provide set or get methods for each private field. These capabilities should be provided only when it makes sense. |
Predicate Methods
Another common use for accessor methods is to test whether a condition is true or falsesuch methods are often called predicate methods. An example of a predicate method would be an isEmpty method for a container classa class capable of holding many objects, such as a linked list, a stack or a queue. (These data structures are discussed in depth in Chapters 17 and 19.) A program might test isEmpty before attempting to read another item from a container object. A program might test isFull before attempting to insert another item into a container object.
Using Set and Get Methods to Create a Class That Is Easier to Debug and Maintain
If only one method performs a particular task, such as setting the hour in a Time2 object, it is easier to debug and maintain the class. If the hour is not being set properly, the code that actually modifies instance variable hour is localized to one method's bodysetHour. Thus, your debugging efforts can be focused on method setHour.