我有一個java程序使用數組列表 - 這些數組列表存儲'變量'其中'變量'是一個抽象類。如何將抽象類轉換爲接口?
現在,爲了節省內存,我想使用名爲HugeCollections-VanillaJava的java庫,但是這個庫需要定義一個接口。
如何將抽象類轉換爲接口?我必須遵循哪些規則/限制才能正確執行轉換?
最後,是否可以使用我的抽象類進行最少的代碼更改,以便需要接口的庫也能正常工作?理想情況下,我想不要改變抽象類...這可能嗎?
我有一個java程序使用數組列表 - 這些數組列表存儲'變量'其中'變量'是一個抽象類。如何將抽象類轉換爲接口?
現在,爲了節省內存,我想使用名爲HugeCollections-VanillaJava的java庫,但是這個庫需要定義一個接口。
如何將抽象類轉換爲接口?我必須遵循哪些規則/限制才能正確執行轉換?
最後,是否可以使用我的抽象類進行最少的代碼更改,以便需要接口的庫也能正常工作?理想情況下,我想不要改變抽象類...這可能嗎?
如何將抽象類轉換爲接口?
讓抽象類的源文件的副本。
在初始聲明中將「class」更改爲「interface」。
更改名稱(可選,取決於你在做什麼)。
刪除由該類實現的任何方法的主體。
將「abstract」一詞從其他字詞中刪除。
刪除所有私人和受保護的會員。
刪除所有構造函數。
從公衆成員中刪除關鍵字「public」。
如果你有任何你刪除的代碼(實現方法,私有或受保護的東西),讓你的原始抽象類實現你的接口並在那裏留下那些東西。
(不完全)例:
Foo
作爲一個抽象類:
public abstact class Foo
{
private int bar;
public static final int SOME_CONSTANT = 42;
public Foo(b) {
this.bar = b;
}
public abstract void doSomething(String s);
protected int doSomethingElse() {
return this.bar * 2;
}
}
Foo
作爲一個接口:
public interface Foo
{
int SOME_CONSTANT = 42;
void doSomething(String s);
}
就我而言,我確實有一些東西老Foo
沒有,我可能有AbstractFoo
什麼的:
...這樣一個實現可以使用它作爲一個起點,如果需要的話(雖然那個private
bar
在那裏,它沒有多大意義)。
@JBNizet:謝謝!完成。 –
如果抽象類沒有定義任何具體方法,甚至可以使用正則表達式。來源:
public abstract class Abstract {
public abstract void method();
//...
}
到:
public interface Interface {
void method();
//...
}
public abstract
修飾符是隱含的接口。如果類別確實定義了一些方法(並非所有的方法都是abstract
)或者有一些字段不能完成(至少很容易)。
不要忘記抽象類中的屬性 –
@LuiggiMendoza:謝謝,添加到我的回答 –
模式Adapter可能會幫助你。
想象一下,你必須使用SomeClass的爲TargetInterface
public abstract class SomeClass {
// some code here
public abstract void someMethod();
}
public interface TargetInterface {
public void someMethodBlaBla();
}
而且他們的方法不同的簽名 - )的someMethod(和someMethodBlaBla()。
所以你可以創建這樣的適配器類:
public class Adapter implements TargetInterface {
private SomeClass adaptee;
public Adapter(SomeClass adaptee) {
this.adaptee = adaptee;
}
public void someMethodBlaBla() {
this.adaptee.someMethod();
}
//delegate all calls to adaptee
}
並在代碼的某個地方,你可以同時使用 - 在當前的代碼適配器和抽象類的實例,無干擾:
SomeClass abstractClassInstance = ... //get instance of your abstract class
TargetInterface targetInterfaceInstance = new Adapter(abstractClassInstance);
你能告訴我們一些你的代碼嗎?你的問題有點混亂。 – Jeremy