泛型和介面的方式設計一個計算器
阿新 • • 發佈:2018-12-21
首先,定義一個介面,進行統一和約束程式碼,
泛型在編寫時,是Object型別的,所以為了計算,把Object轉成字串進行計算,BigDecimal類對字串處理更加精確,計算時用BigDecimal類中的方法進行計算
public interface ICounter { public <T> BigDecimal add(T t1,T t2);//加法 public <T> BigDecimal sub(T t1,T t2);//減法 public <T> BigDecimal mul(T t1,T t2);//乘法 public <T> BigDecimal div(T t1,T t2);//除法 }
然後定義實現類,實現該介面,重寫介面中的方法,實現類程式碼如下:
public class CounterImpl implements ICounter { @Override public <T> BigDecimal add(T t1, T t2) { BigDecimal num1 = new BigDecimal(t1.toString()); BigDecimal num2 = new BigDecimal(t2.toString()); BigDecimal result = num1.add(num2); return result; } @Override public <T> BigDecimal div(T t1, T t2) { BigDecimal num1 = new BigDecimal(t1.toString()); BigDecimal num2 = new BigDecimal(t2.toString()); BigDecimal result ; //因為遇到除不盡的時候會報錯,進行try/catch進行捕獲異常,並保留兩位小數處理 try { result = num1.divide(num2); } catch (Exception e) { System.out.println("該公式除不盡,保留兩位小數"); result = num1.divide(num2,2, BigDecimal.ROUND_HALF_DOWN);//四捨五入保留兩位小數 } return result; } @Override public <T> BigDecimal mul(T t1, T t2) { BigDecimal num1 = new BigDecimal(t1.toString()); BigDecimal num2 = new BigDecimal(t2.toString()); BigDecimal result = num1.multiply(num2); return result; } @Override public <T> BigDecimal sub(T t1, T t2) { BigDecimal num1 = new BigDecimal(t1.toString()); BigDecimal num2 = new BigDecimal(t2.toString()); BigDecimal result = num1.subtract(num2); return result; } }
定義測試類進行測試:
效果如願以償,可以實現不同資料型別的計算的效果
來回修改太麻煩了?再補充一個方法:
介面中新增:
public <T> BigDecimal count(String symbol ,T t1,T t2);//字串代替運算子判斷並計算
實現類中新增:
/** * @desc 字串代替運算子判斷並計算 * @param symbol 運算子 * @param t1 * @param t2 * @return */ public <T> BigDecimal count(String symbol ,T t1,T t2){ BigDecimal result = new BigDecimal(-1);//如果格式不正確返回-1 if ("+".equals(symbol)) { result = add(t1, t2); } else if ("-".equals(symbol)) { result = sub(t1, t2); } else if ("*".equals(symbol)) { result = mul(t1, t2); } else if ("/".equals(symbol)) { result = div(t1, t2); } else { System.out.println("請輸入正確的運算子"); } return result; }
再定義個測試類: