Small Challenges 2

Analise a classe abaixo:


In [1]:
public class Operacao {
   public int soma(int n1, int n2) {
      return n1 + n2;
   }
}


Out[1]:
com.twosigma.beaker.javash.bkr2d457a34.Operacao

In [2]:
Operacao op = new Operacao();
System.out.println(op.soma(10, 15));


25
Out[2]:
null

Exercício

Considerando que o Integer.parseInt() converte uma String para um inteiro. Ajuste ou estenda a classe para que aceite as operações a seguir:

Solução 1 - sem herança


In [3]:
public class Operacao {
   public int soma(int n1, int n2) {
      return n1 + n2;
   }

   public int soma(String n1, int n2) {
      return Integer.parseInt(n1) + n2;
   }

   public int soma(int n1, String n2) {
      return n1 + Integer.parseInt(n2);
   }

   public int soma(String n1, String n2) {
      return Integer.parseInt(n1) + Integer.parseInt(n2);
   }
}


Out[3]:
com.twosigma.beaker.javash.bkr2d457a34.Operacao

In [4]:
Operacao op = new Operacao();
System.out.println(op.soma(10, "15"));
System.out.println(op.soma("10", 15));
System.out.println(op.soma("10", "15"));


25
25
25
Out[4]:
null

Solução 2 - concentrando ação em um método

A ação central deveria ser concentrada em um método, pois futuras evoluções no método de soma refletirão automaticamente nos demais.


In [5]:
public class Operacao {
   public int soma(int n1, int n2) {
      return n1 + n2;
   }

   public int soma(int n1, String n2) {
      return soma(n1, Integer.parseInt(n2));
   }

   public int soma(String n1, int n2) {
      return soma(Integer.parseInt(n1), n2);
   }

   public int soma(String n1, String n2) {
      return soma(Integer.parseInt(n1), Integer.parseInt(n2));
   }
}


Out[5]:
com.twosigma.beaker.javash.bkr2d457a34.Operacao

In [6]:
Operacao op = new Operacao();
System.out.println(op.soma(10, "15"));
System.out.println(op.soma("10", 15));
System.out.println(op.soma("10", "15"));


25
25
25
Out[6]:
null

Solução 3 - com herança

Note que nesta solução você deve prestar atenção que o método soma não faz uso do polimorfismo porque cada versão tem uma assinatura. Portanto, a variável op deve ser declarada e instanciada em OperacaoExtra.


In [7]:
public class Operacao {
    public int soma(int n1, int n2) {
       return n1 + n2;
    }
}


Out[7]:
com.twosigma.beaker.javash.bkr2d457a34.Operacao

In [8]:
public class OperacaoExtra extends Operacao {
   public int soma(int n1, String n2) {
      return soma(n1, Integer.parseInt(n2));
   }

   public int soma(String n1, int n2) {
      return soma(Integer.parseInt(n1), n2);
   }

   public int soma(String n1, String n2) {
      return soma(Integer.parseInt(n1), Integer.parseInt(n2));
   }
}


Out[8]:
com.twosigma.beaker.javash.bkr2d457a34.OperacaoExtra

In [9]:
OperacaoExtra op = new OperacaoExtra();
System.out.println(op.soma(10, "15"));
System.out.println(op.soma("10", 15));
System.out.println(op.soma("10", "15"));


25
25
25
Out[9]:
null