Java time implementation
•
Java
package timeToys;
package timeToys; import java.util.regex.Pattern; ** * A DayTime is an immutable object that stores a moment of day represented in * hour,minutes and seconds. Day or year are not defined. * * @author marius.costa <marius.costa@yahoo.com> */ public class DayTime {`enter code here` private int hour;// hour of the day private int minute;// minute of the hour private int second;// second of the minute private String time;// time as string private static final String TIME_LONG_FORMAT = "([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]"; private static final String TIME_SHORT_FORMAT = "([01]?[0-9]|2[0-3]):[0-5][0-9]"; /** * Class private constructor that creates new objects using inner builder. * * @param timeBuilder - builder for new DayTime objects defined as inner class. */ private DayTime(Builder timeBuilder) { this.hour = timeBuilder.hour; this.minute = timeBuilder.minute; this.second = timeBuilder.second; this.time = timeBuilder. time; } public int getHour() { return hour; } public int getMinute() { return minute; } public int getSecond() { return second; } @Override public String toString() { return time; } /** * Builder is a inner class that creates new DayTime objects based on int params * (hour,minute,second),or by parsing a String param formated as * 'HH:mm' or 'HH:mm:ss'. */ public static class Builder { private int hour = 0; private int minute = 0; private int second = 0; private String time; /** * Constructor that creates a Builder from a String param formated as * 'HH:mm' or 'HH:mm:ss'. * @param time - must be formated as 'HH:mm' or 'HH:mm:ss'. */ public Builder(String time) { this.time = time; } /** * Creates a DayTime object from the String {@link #time}. * The String {@code time} is innitialy parsed to validate time * in 24 hours format with regular expression. * If not,RuntimeExceptions will be thrown. * * * @return DayTime * @throws IllegalArgumentException if the string isn't right formated. * @throws NumberFormatException if int values cannot be extracted from String time. */ public DayTime createTime() { String[] timeUnits = time.split(":"); if(Pattern.compile(TIME_SHORT_FORMAT).matcher(time).matches()) { this.hour = Integer.parseInt(timeUnits[0]); this.minute = Integer.parseInt(timeUnits[1]); } else if(Pattern.compile(TIME_LONG_FORMAT).matcher(time).matches()) { this.hour = Integer.parseInt(timeUnits[0]); this.minute = Integer.parseInt(timeUnits[1]); this.second = Integer.parseInt(timeUnits[2]); } else { throw new IllegalArgumentException("Invalid time format" + " (Expected format: 'HH:mm' or 'HH:mm:ss')."); } return new DayTime(this); } } }
Solution
You can consider adding methods:
Equal to ()
Hash ()
And implement the comparable interface
int compareTo(Object other)
In addition, it is recommended to make it immutable
For example, if you use this type of check to see if something must happen:
class Remainder { private String what; private DateTime when; public static Remainder remindMe( String what,DateTime when ) { Reminder r = new Reminder(); r.what = what; r.when = when; } public boolean isTimeAlready() { //return DateTime.Builder.createTime().compareTo( this.when ) > 0; // implemented somehow return isCurrentTimeGreaterThan( this.when ); // assume it return true if current time is after "when" } }
If you use it this way:
DateTime atSix = new DateTime( 18,0 ); Reminder reminder = Reminder.remindMe("Go for the milk",atSix );
The hours have changed (of course wrong)
atSix.setHour( 1 );
For a "reminder" object, when a variable is private will not be useful because its reference remains external and cannot be controlled, so it becomes unreliable
This may be a very strange mistake you may introduce Using immutable objects is not error - prone This is why core objects in Java such as string, integer and many other objects are immutable
If you can read this book: effective Java, it will turn 180 degrees from the Java perspective
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码