Números fracionários - Soma de fração

	int x = 5;
	int y = 2;
	
	if(x%y != 0){
		System.out.println(x+ "/" +y);
	}else{
		System.out.println(x/y);
	}

Tenho esse algoritmo acima para me retornar o número em forma de fração caso seu quociente não seja um número inteiro.
Gostaria de saber qual seria a lógica, para somar esse número em forma de fração, com outro fracionado ou não e o resultado continuar em forma de fração. Ou seja, 1/2 + 1 = 3/2.

Para que seja possível construir um algoritmo, antes de mais nada, é necessário saber como as coisas funcionam.
Portanto, dá uma olhada aqui

Nunca tinha parado pra pensar nesse problema, achei interessante o suficiente para tentar fazer algo aqui. Depois de dar uma revisada em frações, cheguei nisso aqui:

class Main {
    public static void main(String[] args) {
        Fracao f1 = new Fracao(2, 2);
        Fracao f2 = new Fracao(-2, 4);
        System.out.println(f1.mais(f2).simplificada());
    }
}

class Fracao {
    private final long numerador;
    private final long denominador;

    public Fracao(final long numerador, final long denominador) {
        if (denominador == 0l)
            throw new IllegalArgumentException("Denominador não pode ser igual a zero.");
        this.numerador = numerador;
        this.denominador = denominador;
    }

    public Fracao mais(Fracao outraFracao) {
        final long novoDenominador = lcm(denominador, outraFracao.denominador);
        final long novoNumerador = this.encontraNovoNumerador(novoDenominador) + outraFracao.encontraNovoNumerador(novoDenominador);
        return new Fracao(novoNumerador, novoDenominador);
    }

    public Fracao simplificada() {
        long gcd = gcd(numerador, denominador);
        return new Fracao(numerador / gcd, denominador / gcd);
    }

    private long encontraNovoNumerador(long novoDenominador) {
        return novoDenominador / denominador * numerador;
    }

    private static long lcm(long a, long b) {
        return a / gcd(a, b) * b;
    }

    private static long gcd(long a, long b) {
        while (b != 0) {
            long temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }

    @Override
    public String toString() {
        return numerador + "/" + denominador;
    }

}