package test2; /** * A class that represents temperatures in degrees Celcius or degrees * Fahrenheit. * * */ public class Temperature { /** * The abbreviation of Celcius. */ public static final String CELCIUS = "C"; /** * The abbreviation of Fahrenheit */ public static final String FAHRENHEIT = "F"; private double degC; private double degF; private String units; /** * Initializes the temperature to 0 degrees Celcius. */ public Temperature() { this(0.0, Temperature.CELCIUS); } /** * Initializes the temperature by copying the numeric value and units of * another temperature. * * @param other * the temperature to copy */ public Temperature(Temperature other) { this(other.getTemperature(), other.getUnits()); } /** * Initializes the temperature to the given numeric value having the given * units. * * @param temp * the temperature * @param units * the units (Temperature.CELCIUS or Temperature.FAHRENHEIT) * @throws IllegalArgumentException * if units is not one of Temperature.CELCIUS or * Temperature.FAHRENHEIT */ public Temperature(double temp, String units) { this.setUnits(units); this.setTemperature(temp); } /** * Gets the numeric value of the temperature using the current units. For * instance, the value of degC is 0.0 and the * value of degF is 32.0 in the following example: * *
     * Temperature t = new Temperature(0.0, Temperature.CELCIUS);
     * double degC = t.getTemperature();
     * 
     * Temperature u = new Temperature(32.0, Temperature.FAHRENHEIT);
     * double degF = u.getTemperature();
     * 
* * @return the numeric value of the temperature using the current units */ public double getTemperature() { if (this.units.equals(Temperature.CELCIUS)) { return this.degC; } return this.degF; } /** * Sets the numeric value of the temperature using the current units. For * instance, the final numeric value of t is 15.0 * degrees Celcius in the example below: * *
     * Temperature t = new Temperature(0.0, Temperature.CELCIUS);
     * t.setTemperature(15.0);
     * 
* * @param temp * the numeric value of the temperature */ public final void setTemperature(double temp) { if (this.units.equals(Temperature.CELCIUS)) { this.degC = temp; this.degF = Temperature.toFahrenheit(temp); } else { this.degF = temp; this.degC = Temperature.toCelcius(temp); } } /** * Gets the units of the temperature. * * @return Temperature.CELCIUS if the temperature is in * Celcius, or Temperature.FAHRENHEIT if the * temperature is in Fahrenheit. */ public String getUnits() { return this.units; } /** * Set the units of the temperature. This method has the side effect that * the numeric value of the temperature changes to reflect the change in * units. For instance, changing the units of 0 degrees Celcius * to Fahrenheit causes the value of degF to be * 32.0 (because 0C is equal to 32F): * *
     * Temperature t = new Temperature(0, Temperature.CELCIUS);
     * t.setUnits(Temperature.FAHRENHEIT);
     * double degF = t.getTemperature();    // degF is equal to 32.0
     * String units = t.getUnits();         // units is equal to Temperature.FAHRENHEIT 
     * 
* * @param units * the units of the temperature (Temperature.CELCIUS * or Temperature.FAHRENHEIT) * @throws IllegalArgumentException * if units is not one of * Temperature.CELCIUS or Temperature.FAHRENHEIT * */ public final void setUnits(String units) { if (!units.equals(Temperature.CELCIUS) && !units.equals(Temperature.FAHRENHEIT)) { throw new IllegalArgumentException(); } this.units = units; } /** * Converts a value of degrees Fahrenheit to the equivalent value of degrees * Celcius. The formula to convert degrees Fahrenheit to degrees Celcius is: * *

* C = (F - 32) × (5 / 9) * *

* where F is degrees Fahrenheit and C is degrees Celcius. * * @param degF * a value of degrees Fahrenheit * @return the equivalent value in degrees Celcius */ public static double toCelcius(double degF) { return (degF - 32.0) * 5.0 / 9.0; } /** * Converts a value of degrees Celcius to the equivalent value of degrees * Fahrenheit. The formula to convert degrees Celcius to degrees Fahrenheit * is: * *

* F = C × (9 / 5) + 32 * *

* where C is degrees Celcius and F is degrees Fahrenheit. * * @param degC * a value of degrees Celcius * @return the equivalent value in degrees Fahrenheit */ public static double toFahrenheit(double degC) { return degC * 9.0 / 5.0 + 32.0; } /** * Returns a string made up of the numeric value of the temperature followed * by its units. For example, the Strings * *

     * -12.5C
     * 73.01234F
     * 
* *

* are returned for temperatures of -12.5 degrees Celcius and * 73.01234 degrees Fahrenheit, respectively. * * @return a string representation of the temperature */ @Override public String toString() { if (this.getUnits().equals(Temperature.CELCIUS)) { return this.getTemperature() + Temperature.CELCIUS; } else { return this.getTemperature() + Temperature.FAHRENHEIT; } } /** * Compares two temperatures for equality. Two temperatures are considered * equal if they represent the same temperature expressed in degrees * Celcius. For instance, the values of eq1 and * eq2 are true in the following example: * *

     * Temperature t = new Temperature(0.0, Temperature.CELCIUS);
     * Temperature u = new Temperature(32.0, Temperature.FAHRENHEIT);
     * boolean eq1 = t.equals(u);
     * boolean eq2 = u.equals(t);
     * 
* *

* because 32 degrees Fahrenheit is equivalent to * 0 degrees Celcius, and vice versa. * * @param obj an object to compare with this Temperature * @return true if obj is a Temperature object with the same * temperature when expressed in degrees Celcius as this temperature * */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Temperature other = (Temperature) obj; if (Double.doubleToLongBits(this.degC) != Double.doubleToLongBits(other.degC)) return false; return true; } }