2013-03-08 109 views
0

我已經發布了一些相關的代碼在此問題: Specify object type of a returned array list dynamically如何強制把一個對象轉換成處理類

現在我的問題是更具體一點。

其實我現在用的是下面的「處理」類調用的實現了這個接口IMSSQLStatement類中的方法:

public class MSSQLHandler { 

    IMSSQLStatement statement; 

    public MSSQLHandler(IMSSQLStatement statement) { 
     this.statement = statement; 
    } 

    public void invoke() throws SQLException { 
     statement.executeStatement(); 
    } 

    public List<?> getDataList() throws SQLException { 
     return statement.getDataList(); 
    } 
} 

現在的問題是怎樣逼我(或它實現我的接口的開發者)將已實施的類的創建對象置於MSSQLHandler

也許這是不好的設計,但我沒有找到任何有關我的問題的信息和用例。

+0

你不能......因爲接口不能執行任何操作,除了方法簽名的實現。 – Mordechai 2013-03-08 07:59:48

+0

嗯,好的。其他技術可能嗎?也許抽象類? – sk2212 2013-03-08 08:05:56

回答

1

是的,你可以使用抽象類有明確的構造,即自動呼籲所有子類:

public abstract class IMSSQLStatement { 

    protected IMSSQLHandler handler; 

    public IMSSQLStatement() { 
     handler = new IMSSQLHandler(this); 
    } 
} 

編輯:(參照註釋)

如果你想只有處理程序應該能夠調用IMSSQLStatement中的方法,這兩個類都應該放在同一個包中。通過給出protected修飾符,僅允許包私有和子類訪問。雖然這些方法可以在子類本身中調用,但除了包之外,它不能在外部訪問。

這不會完全解決您的問題。其他(真正的假)方式將是反射

使用反射,你應該在文檔中編寫子類應該用準確的方法簽名(當然,不定義的超類的抽象方法),賦予其私人修改。處理程序應該通過反射來訪問這些方法。

請參閱一些描述如何使用反射的文檔。這很複雜,超出了SO的範圍。

+0

好的,處理程序類現在在創建實現類的對象時被調用。但這並不是我想要的。我仍然可以在處理器類的「外部」執行實現類的方法。但我希望只有處理程序類能夠執行這些方法。 – sk2212 2013-03-08 08:51:15

+0

謝謝!我已經閱讀了一些關於反射的內容來解決這個用例。我只需要使私有方法可訪問並調用它。然而,這是一個好習慣嗎?這是用在一些「官方」的Java庫嗎? – sk2212 2013-03-08 09:22:58

+0

它們經常在Java標準類中使用,例如序列化,LookAndFeel加載等等。閱讀[這裏](http://uet.vnu.edu.vn/~chauttm/e-books/java/Effective.Java.2nd.Edition.May.2008.3000th.Release.pdf)(第230頁)和反思的缺點 – Mordechai 2013-03-08 10:06:21

相關問題