8.8 Composition
Class Date
// Fig. 8.7: Date.java
// Date class declaration.
public class Date
{
private int month; // 1-12
private int day; // 1-31 based on month
private int year; // any year
private static final int[] daysPerMonth = // days in each month
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
// constructor: call checkMonth to confirm proper value for month;
// call checkDay to confirm proper value for day
public Date( int theMonth, int theDay, int theYear )
{
month = checkMonth( theMonth ); // validate month
year = theYear; // could validate year
day = checkDay( theDay ); // validate day
System.out.printf(
"Date object constructor for date %s\n", this );
} // end Date constructor
// utility method to confirm proper month value
private int checkMonth( int testMonth )
{
if ( testMonth > 0 && testMonth <= 12 ) // validate month
return testMonth;
else // month is invalid
throw new IllegalArgumentException( "month must be 1-12" );
} // end method checkMonth
// utility method to confirm proper day value based on month and year
private int checkDay( int testDay )
{
// check if day in range for month
if ( testDay > 0 && testDay <= daysPerMonth[ month ] )
return testDay;
// check for leap year
if ( month == 2 && testDay == 29 && ( year % 400 == 0 ||
( year % 4 == 0 && year % 100 != 0 ) ) )
return testDay;
throw new IllegalArgumentException(
"day out-of-range for the specified month and year" );
} // end method checkDay
// return a String of the form month/day/year
public String toString()
{
return String.format( "%d/%d/%d", month, day, year );
} // end method toS
Class Employee
// Fig. 8.8: Employee.java
// Employee class with references to other objects.
public class Employee
{
private String firstName;
private String lastName;
// constructor to initialize name, birth date and hire date
public Employee( String first, String last, Date dateOfBirth,
Date dateOfHire )
{
firstName = first;
lastName = last;
birthDate = dateOfBirth;
hireDate = dateOfHire;
} // end Employee constructor
// convert Employee to String format
public String toString()
{
return String.format( "%s, %s Hired: %s Birthday: %s",
lastName, firstName, hireDate, birthDate );
} // end method toString
} // end class Employee
Class EmployeeTest
// Fig. 8.9: EmployeeTest.java
// Composition demonstration.
public class EmployeeTest
{
public static void main( String[] args )
{
Date birth = new Date( 7, 24, 1949 );
Date hire = new Date( 3, 12, 1988 );
} // end main
} // end class EmployeeTesst
8.9 Enumerations
// Fig. 8.10: Book.java
// Declaring an enum type with constructor and explicit instance fields
// and accessors for these fields
public enum Book
{
// instance fields
private final String title; // book title
private final String copyrightYear; // copyright year
Fig. 8.10 | Declaring an enum type with constructor and explicit instance fields and accessors
for these fields. (Part 1 of 2.)
// declare constants of enum type
JHTP( "Java How to Program", "2012" ),
CHTP( "C How to Program", "2007" ),
IW3HTP( "Internet & World Wide Web How to Program", "2008" ),
CPPHTP( "C++ How to Program", "2012" ),
VBHTP( "Visual Basic 2010 How to Program", "2011" ),
CSHARPHTP( "Visual C# 2010 How to Program", "2011" );
// enum constructor
Book( String bookTitle, String year )
{
title = bookTitle;
copyrightYear = year;
} // end enum Book constructor
// accessor for field title
public String getTitle()
{
return title;
} // end method getTitle
// accessor for field copyrightYear
public String getCopyrightYear()
{
return copyrightYear;
} // end method getCopyrightYear
} // end enum Book
// Fig. 8.11: EnumTest.java
// Testing enum type Book.
import java.util.EnumSet;
public class EnumTest
{
public static void main( String[] args )
{
System.out.println( "All books:\n" );
// print all books in enum Book
for ( )
System.out.printf( "%-10s%-45s%s\n", book,
, );
System.out.println( "\nDisplay a range of enum constants:\n" );
// print first four books
for ( Book book : )
System.out.printf( "%-10s%-45s%s\n", book,
, );
} // end main
} // end class EnumTest