2014-05-05 68 views
0

我想在我的Uni項目的Java中創建一個API。創建一個類來擴展一個API

以下可能。

我有MyClass的2個版本,其中一個不包含方法體中的代碼。

例如:

完整版本:

public MyClass { 
    public String name; 

    public MyClass(String name) { 
      this.name = name; 
    } 

    public String getSpecialVersion(){ 
     return name + name; 
    } 
} 

API版本:

public MyClass { 
    public String name; 

    public MyClass(String name) {} 

    public String getSpecialVersion(){ return null; } 
} 

的想法是用戶擴展的類的API版本,但在完整版類在運行時加載。

這是可能在Java中,還是有更好的方法來做到這一點?

在此先感謝!

+1

也許你想使用一個接口? –

回答

1

您想創建一個接口並讓「with code」-version 實現該接口。

public interface IMyClass { 

    public String getSpecialVersion(); 

} 

實現:

public class MyClass implements IMyClass { 

    public String name; 

    public MyClass(String name) { 
     this.name = name; 
    } 

    @Override 
    public String getSpecialVersion() { 
     return name + name; 
    } 

} 

不能定義接口的構造函數(在接口和定義域是一種非常規的)壽,所以你可能想看看抽象類的是,太:

public abstract class AbstractMyClass { 

    public String name; 

    public AbstractMyClass(String name) { 
     this.name = name; 
    } 

    public abstract String getSpecialVersion(); 

} 

此類可通過的具體類擴展添加方法體:

public class MyClass extends AbstractMyClass { 

    public MyClass(String name) { 
     super(name); 
    } 

    @Override 
    public String getSpecialVersion() { 
     return name + name; 
    } 

} 
+0

啊,我沒有考慮使用抽象類。但想一想,我不應該有這樣的公共領域!我會嘗試重構一個接口:) cheers – FraserK

+0

如果你想要在運行時加載一個接口的實現,並且你不需要像Guice或Spring這樣的依賴注入框架的全部功能/複雜性,你可以看看JDK內置的ServiceLoader - http://docs.oracle.com/javase/7/docs/api/index.html?index-filesindex-1.html – adamretter