Начальное замечание:
Никогда не пиши это:
if ( condition ) statement;
Это намного лучше
if ( condition ) { statement };
Просто создай, чтобы создать хорошую привычку.
Сделав класс неизменным, как предложено, вы также можете воспользоваться преимуществом double для выполнения операций equals и hashCode и compareTo
Вот моя быстрая грязная версия:
public final class Fraction implements Comparable {
private final int numerator;
private final int denominator;
private final Double internal;
public static Fraction createFraction( int numerator, int denominator ) {
return new Fraction( numerator, denominator );
}
private Fraction(int numerator, int denominator) {
this.numerator = numerator;
this.denominator = denominator;
this.internal = ((double) numerator)/((double) denominator);
}
public int getNumerator() {
return this.numerator;
}
public int getDenominator() {
return this.denominator;
}
private double doubleValue() {
return internal;
}
public int compareTo( Object o ) {
if ( o instanceof Fraction ) {
return internal.compareTo( ((Fraction)o).internal );
}
return 1;
}
public boolean equals( Object o ) {
if ( o instanceof Fraction ) {
return this.internal.equals( ((Fraction)o).internal );
}
return false;
}
public int hashCode() {
return internal.hashCode();
}
public String toString() {
return String.format("%d/%d", numerator, denominator );
}
public static void main( String [] args ) {
System.out.println( Fraction.createFraction( 1 , 2 ) ) ;
System.out.println( Fraction.createFraction( 1 , 2 ).hashCode() ) ;
System.out.println( Fraction.createFraction( 1 , 2 ).compareTo( Fraction.createFraction(2,4) ) ) ;
System.out.println( Fraction.createFraction( 1 , 2 ).equals( Fraction.createFraction(4,8) ) ) ;
System.out.println( Fraction.createFraction( 3 , 9 ).equals( Fraction.createFraction(1,3) ) ) ;
}
}
Что касается статического метода фабрики, он может быть полезен позже, если вы создадите подкласс Fraction для обработки более сложных вещей или если вы решите использовать пул для наиболее часто используемых объектов.
Возможно, дело не в этом, я просто хотел указать на это. :)
См. Эффективная Java Первый элемент.