// Person.java -- demonstrate methods in class and calendar

import java.util.Calendar;        // Should convert to java.time.*
import java.text.ParseException;
import java.text.SimpleDateFormat;

public final class Person {

   // shared constants, procedures, ...
   private static final SimpleDateFormat DMY = new SimpleDateFormat ("dd MMM yyyy");

   // instance variables
   final String name;
   private final Calendar dob;  // Java Date, Calendar are ugly and mutable!

   // constructor of class "Person"
   Person (final String name, final Calendar dob) {
      this.name = name;
      this.dob = dob;
   }

   Person (final String name, final String dob) throws ParseException {
      this (name, Person.date(dob));
   }

   // method of class "Person"
   int age () {
      final Calendar today = Calendar.getInstance();
      final int diff = today.get(Calendar.YEAR) - dob.get(Calendar.YEAR);
      final int thisDay = today.get(Calendar.DAY_OF_YEAR);
      final int dobDay  = dob.get(Calendar.DAY_OF_YEAR);
      return thisDay > dobDay ? diff  : diff-1;
   }

   public static Calendar date (final String x) throws ParseException {
      final Calendar r = Calendar.getInstance();
      r.setTime (DMY.parse (x));
      return r;
   }
 
   public static void main (final String [] args) throws ParseException {
      final String f = "Age is %s%n";

      final Person p = new Person ("William H. Gates", "28 Oct 1955");
      System.out.format (f, p.age());

      final Person g = new Person ("Gösta Mittag-Leffler", "16 Mar 1846");
      System.out.format (f, g.age());

      final Person a = new Person ("Howard Aiken", "14 Mar 1900");
      System.out.format (f, a.age());
   }
}