我有針對不同型別的三個類似的課程。
public class IntClass {
private int p1; private int p2;
IntClass(int p1, int p2) { this.p1=p1; this.p2=p2; }
int getP1() { return p1; }
int getP2() { return p2; }
}
public class DoubleClass {
private double p1; private double p2;
DoubleClass(double p1, double p2) { this.p1=p1; this.p2=p2; }
double getP1() { return p1; }
double getP2() { return p2; }
}
public class StringClass {
private String p1; private String p2;
StringClass(String p1, String p2) { this.p1=p1; this.p2=p2; }
String getP1() { return p1; }
String getP2() { return p2; }
}
public class C4 {
...
private IntClass c1;
private DoubleClass c2;
private StringClass c3;
...
IntClass getIntClass() { return C1; }
DoubleClass getDoubleClass() { return C2; }
StringClass getStringClass() { return C3; }
...
}
在代碼庫的其他地方,我有以下帶有 3 個類似方法的代碼片段。
...
int a = getInt(C4::getIntClass, boolValue);
double b = getDouble(C4::getDoubleClass, boolValue);
String c = getString(C4::getStringClass, boolValue);
...
private int getInt(Supplier<IntClass> executable, boolean boolValue) {
...
return boolValue? executable.get().getP1(): executable.get().getP2();
}
private double getDouble(Supplier<DoubleClass> executable, boolean boolValue) {
...
return boolValue? executable.get().getP1(): executable.get().getP2();
}
private String getString(Supplier<StringClass> executable, boolean boolValue) {
...
return boolValue? executable.get().getP1(): executable.get().getP2();
}
我想寫一個通用方法getValue來代替getInt, getDouble, getString。我們怎么能這樣做呢?
編輯:- 不能為IntClass,制作通用類DoubleClass,StringClass因為它們也服務于其他一些用例并且位于不同的包庫中。只是想通過撰寫一個通用的通用方法并洗掉類似的冗余代碼來重構代碼。只是一個想法!!任何特定于用例的建議將不勝感激。
uj5u.com熱心網友回復:
@Test
public void test() {
PairOf<String> pairOfStr = new PairOf<>("abc", "def");
PairOf<Integer> pairOfInt = new PairOf<>(1, 2);
PairOf<Double> pairOfDouble = new PairOf<>(1.0, 2.0);
Assertions.assertEquals(pairOfStr.getFirst(), getValue(pairOfStr, true));
Assertions.assertEquals(pairOfInt.getFirst(), getValue(pairOfInt, true));
Assertions.assertEquals(pairOfDouble.getFirst(), getValue(pairOfDouble, true));
}
public class PairOf<T> {
private T first;
private T second;
public PairOf(T first, T second) {
this.first = first;
this.second = second;
}
public T getFirst() {
return first;
}
public T getSecond() {
return second;
}
}
public <T> T getValue(PairOf<T> t, boolean first) {
return first ? t.getFirst() : t.getSecond();
}
使用數字,您可以通過方法轉換為原始型別:
getValue(pairOfInt, true).intValue();
getValue(pairOfDouble, true).doubleValue();
uj5u.com熱心網友回復:
嘗試這個:
public class GenericClass<T> {
private T p1;
private T p2;
GenericClass(T p1, T p2) {
this.p1=p1;
this.p2=p2;
}
T getP1() { return p1; }
T getP2() { return p2; }
}
private T getValue(Supplier<GenericClass<T>> executable, boolean boolValue) {
return boolValue ? executable.get().getP1(): executable.get().getP2();
}
uj5u.com熱心網友回復:
好吧,您需要從一個泛型類開始,然后執行以下操作:
public class PairOf<T> {
private T first;
private T second;
public PairOf(T first, T second) {
this.first = first;
this.second = second;
}
public T getFirst() { return first; }
public T getSecond() { return second; }
}
然后您可以完全像以前一樣使用這個類代替您的特定類。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/376628.html
