我有以下代碼:
MyVersion6 myClass = returnMyClass();
// about 50 lines of code that do the following:
// do some logic with fields of myClass
// create and return another class using some fields of myClass
現在我必須支持版本 7,我可以在 returnMyClass() 方法中回傳它。
實作剩余 50 行的最優雅方式是什么?在這種情況下, MyVersion6 和 MyVersion7 支持完全相同的方法,但我不想這樣做
if ( myClass instanceOf MyVersion6 )
do the 50 lines using (MyVersion6) myClass
else if ( ( myClass instanceOf MyVersion7 )
do the exact same 50 lines using (MyVersion7) myClass
有任何想法嗎?
uj5u.com熱心網友回復:
我建議您創建一個將由類實作的介面,例如 MyVersion6 MyVersion7
例子
public class MyVersion7 implements someInterface{}
public class MyVersion6 implements someInterface{}
然后你可以檢查
if ( myClass instanceOf someInterface)
do the 50 lines using (someInterface) myClass
如果任何類實作了該介面,instanceOf someInterface 將產生 true。
uj5u.com熱心網友回復:
新版本物件應避免更改介面 (API)。由于新版本與原始版本共享許多通用代碼,因此我將使用繼承并讓動態調度處理差異。然后我只會在具有特定方法的新版本的情況下使用強制轉換。但是您應該避免在新版本中添加特定方法。
class MyObject {
public String toString() { return "MyObject"; }
}
class MyObjectV2 extends MyObject {
public String toString() { return "MyObjectV2"; }
}
class MyObjectV3 extends MyObjectV2 {
public String toString() { return "MyObjectV2"; }
public void v3specific() { System.out.println("v3 specific method");}
}
public class JavaApplication24 {
public static void main(String[] args) {
MyObject[] objects = {new MyObject(), new MyObjectV2(), new MyObjectV3()};
for (MyObject o : objects) {
System.out.println(o);
if (o instanceof MyObjectV3)
((MyObjectV3)o).v3specific();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/403812.html
標籤:
上一篇:沒有快取版本的org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21可用于離線模式錯誤
