Java ScreenShot

Screenshot Core Java 2: Volume I - Fundamentals

Table of Contents
 4.  Objects and Classes

Class Design Hints

Without trying to be comprehensive or tedious, we want to end this chapter with some hints that may make your classes more acceptable in well-mannered OOP circles.

  1. Always keep data private.

    This is first and foremost: doing anything else violates encapsulation. You may need to write an accessor or mutator method occasionally, but you are still better off keeping the instance fields private. Bitter experience has shown that how the data are represented may change, but how they are used will change much less frequently. When data are kept private, changes in their representation do not affect the user of the class, and bugs are easier to detect.

  2. Always initialize data.

    Java won't initialize local variables for you, but it will initialize instance fields of objects. Don't rely on the defaults, but initialize the variables explicitly, either by supplying a default or by setting defaults in all constructors.

  3. Don't use too many basic types in a class.

    The idea is to replace multiple related uses of basic types with other classes. This keeps your classes easier to understand and to change. For example, replace the following instance fields in a Customer class

    private String street;
    private String city;
    private String state;
    private int zip;

    with a new class called Address. This way, you can easily cope with changes to addresses, such as the need to deal with international addresses.

  4. Not all fields need individual field accessors and mutators.

    You may need to get and set an employee's salary. You certainly won't need to change the hiring date once the object is constructed. And, quite often, objects have instance fields that you don't want others to get or set, for example, an array of state abbreviations in an Address class.

  5. Use a standard form for class definitions.

    We always list the contents of classes in the following order:

    public features

    package scope features

    private features

    Within each section, we list:

    instance methods

    static methods

    instance fields

    static fields

    After all, the users of your class are more interested in the public interface than in the details of the private implementation. And they are more interested in methods than in data.

    However, there is no universal agreement on what is the best style. The Sun coding style guide for the Java coding language recommends listing fields first and then methods. Whatever style you use, the most important thing is to be consistent.

  6. Break up classes with too many responsibilities.

    This hint is, of course, vague: "too many" is obviously in the eye of the beholder. However, if there is an obvious way to make one complicated class into two classes that are conceptually simpler, seize the opportunity. (On the other hand, don't go overboard; 10 classes, each with only one method, is usually overkill.)

    Here is an example of a bad design.

    class CardDeck // bad design
     public CardDeck() { . . . }
     public void shuffle() { . . . }
     public int getTopValue() { . . . }
     public int getTopSuit() { . . . }
     public void draw() { . . . }
     private int[] value;
     private int[] suit;

    This class really implements two separate concepts: a deck of cards, with its shuffle and draw methods, and a card, with the methods to inspect the value and suit of a card. It makes sense to introduce a Card class that represents an individual card. Now you have two classes, each with its own responsibilities:

    class CardDeck
     public CardDeck() { . . . }
     public void shuffle() { . . . }
     public Card getTop() { . . . }
     public void draw() { . . . }
     private Card[] cards;
     class Card
     public Card(int aValue, int aSuit) { . . . }
     public int getValue() { . . . }
     public int getSuit() { . . . }
     private int value;
     private int suit;

  7. Make the names of your classes and methods reflect their responsibilities.

    Just as variables should have meaningful names that reflect what they represent, so should classes. (The standard library certainly contains some dubious examples, such as the Date class that describes time.)

    A good convention is that a class name should be a noun (Order) or a noun preceded by an adjective (RushOrder) or a gerund (an "-ing" word, like BillingAddress). As for methods, follow the standard convention that accessor methods begin with a lowercase get (getSalary), and mutator methods use a lowercase set (setSalary).

Java ScreenShot