Realizar conversões de temperatura é bastante simples quando criamos tipos de dados distintos para cada unidade de temperatura.
No GitHub disponibilizei uma classe chamada Unit, essa classe nada mais é do que uma abstração para as unidades Celsius, Farenheit e Kelvin.
Abaixo temos um exemplo de como utilizar essa classe para obter instâncias dessas unidades, bem como realizar conversões entre elas.
import br.com.staroski.tools.temperature.*;
public class Exemplo {
public static void main(String[] args) {
for (int temperatura = 0; temperatura <= 100; temperatura++) {
System.out.println("Cenario 1 Celsius");
Unit c = Unit.celsius(temperatura); // obter instancia de Celsius
System.out.println("Celsius: " + c);
System.out.println("Farenheit: " + c.toFarenheit()); // converter para Farenheit
System.out.println("Kelvin: " + c.toKelvin()); // converter para Kelvin
System.out.println();
System.out.println("Cenario 2 Farenheit");
Unit f = Unit.farenheit(temperatura); // obter instancia de Farenheit
System.out.println("Farenheit: " + f);
System.out.println("Celsius: " + f.toCelsius()); // converter para Celsius
System.out.println("Kelvin: " + f.toKelvin()); // converter para Kelvin
System.out.println();
System.out.println("Cenario 3 Kelvin");
Unit k = Unit.kelvin(temperatura); // obter instancia de Kelvin
System.out.println("Kelvin: " + k);
System.out.println("Celsius: " + k.toCelsius()); // converter para Celsius
System.out.println("Farenheit: " + k.toFarenheit()); // converter para Farenheit
System.out.println();
}
}
}
Abaixo está o código fonte da classe Unit, no entanto recomendo baixar diratamente do GitHub.
package br.com.staroski.tools.temperature;
/**
* Abstração para unidades de temperatura, disponibiliza métodos para obter instâncias das unidades {@link Celsius}, {@link Farenheit} e {@link Kelvin}<BR>
* - Para obter instâncias de {@link Celsius}, utilize o método {@link #celsius(double)}<BR>
* - Para obter instâncias de {@link Farenheit}, utilize o método {@link #farenheit(double)}<BR>
* - Para obter instâncias de {@link Kelvin}, utilize o método {@link #kelvin(double)}<BR>.
*
* @author Ricardo Artur Staroski
*/
public abstract class Unit extends Number {
/**
* Unidade de temperatura Celsius
*
* @author Ricardo Artur Staroski
*/
public static class Celsius extends Unit {
private static final long serialVersionUID = 1;
private Celsius(double value) {
super(value);
}
@Override
public Celsius toCelsius() {
return this;
}
@Override
public Farenheit toFarenheit() {
return farenheit(value * 1.8 + 32);
}
@Override
public Kelvin toKelvin() {
return kelvin(value + 273.15);
}
}
/**
* Unidade de temperatura Farenheit
*
* @author Ricardo Artur Staroski
*/
public static class Farenheit extends Unit {
private static final long serialVersionUID = 1;
private Farenheit(double value) {
super(value);
}
@Override
public Celsius toCelsius() {
return celsius((value - 32) / 1.8);
}
@Override
public Farenheit toFarenheit() {
return this;
}
@Override
public Kelvin toKelvin() {
return kelvin((value + 459.67) * (5 / 9.0));
}
}
/**
* Unidade de temperatura Kelvin
*
* @author Ricardo Artur Staroski
*/
public static class Kelvin extends Unit {
private static final long serialVersionUID = 1;
private Kelvin(double value) {
super(value);
}
@Override
public Celsius toCelsius() {
return celsius(value - 273.15);
}
@Override
public Farenheit toFarenheit() {
return farenheit((value / (5 / 9.0)) - 459.67);
}
@Override
public Kelvin toKelvin() {
return this;
}
}
/**
* Obtém uma instância da unidade {@link Celsius} com o valor informado
*
* @param value O valor da unidade
*
* @return A instância de {@link Celsius}
*/
public static Celsius celsius(double value) {
return new Celsius(value);
}
/**
* Obtém uma instância da unidade {@link Farenheit} com o valor informado
*
* @param value O valor da unidade
*
* @return A instância de {@link Farenheit}
*/
public static Farenheit farenheit(double value) {
return new Farenheit(value);
}
/**
* Obtém uma instância da unidade {@link Kelvin} com o valor informado
*
* @param value O valor da unidade
*
* @return A instância de {@link Kelvin}
*/
public static Kelvin kelvin(double value) {
return new Kelvin(value);
}
private static final long serialVersionUID = 1;
/**
* O valor encapsulado por esta unidade de temperatura
*/
public final double value;
private Unit(double value) {
this.value = value;
}
@Override
public double doubleValue() {
return value;
}
@Override
public float floatValue() {
return (float) value;
}
@Override
public int intValue() {
return (int) value;
}
@Override
public long longValue() {
return (long) value;
}
/**
* Converte esta unidade de temperatura para {@link Celsius}
*
* @return O equivalente desta unidade de temperatura em {@link Celsius}
*/
public abstract Celsius toCelsius();
/**
* Converte esta unidade de temperatura para {@link Farenheit}
*
* @return O equivalente desta unidade de temperatura em {@link Farenheit}
*/
public abstract Farenheit toFarenheit();
/**
* Converte esta unidade de temperatura para {@link Kelvin}
*
* @return O equivalente desta unidade de temperatura em {@link Kelvin}
*/
public abstract Kelvin toKelvin();
@Override
public String toString() {
return String.valueOf(value);
}
}