2012-04-05 70 views
1

我有一個非常大且臃腫的類,我想將它分成單獨的文件,但它應該對用戶完全透明,並與使用該類的現有項目兼容。

特別是我有我自己的ImageMatrix類,它定義了一噸一元函數,一噸標量二進制函數,一噸二元函數與另一幅圖像等。爲了保持類的清潔和可維護性,我希望把每一類操作符放在一個單獨的文件中。

有沒有辦法將這些方法剪切/粘貼到文件中並將它們包含在源代碼中?

所以我希望我還是能做到這一點,但實際上方法駐留在不同的文件中:

ImageMatrix img = new ImageMatrix(800, 600, 3); 
    img.clear(0.5f, 0.0f, 0,0f); 
    img.addSelf(anotherImg); 
    img.normalize(); 
    img.abs(); 
    img.addSelf(0.5); 

每種方法都是15-30左右的代碼行,因爲這些實現性能極爲優化,就像無法用Bufferedimage或者簡單的int []來實現一樣。有很多代碼重複,這是將類似的方法組合在一起的主要原因。如果我添加一個函數,或者如果我改變全局行爲(如錯誤檢查),我可以很容易地保持一致。

回答

1

您也可以使用委託方法。這意味着您的方法的定義仍然在ImageMatrix中,但它們在另一個類中實現。根據您的方法的複雜程度,這可能會減少ImageMatrix中的代碼量。

class ImageMatrix { 

    MatrixHelperOne helperOne = new MatrixHelperOne(); 

    ... 

    public void complexMethod1(Arg arg) { 
     helperOne.complexMethod1(arg); 
    } 

    ... 
} 
+1

這聽起來像是最好的方法。我將使用ImageMatrix中的靜態方法創建外部類。 – 2012-04-05 08:53:33

2

不幸的是,將Java類定義分成多個文件是不可能的。

嘗試重構您的代碼,以便不需要巨大的類定義。通常這意味着通過getter和setter方法暴露某些狀態,並編寫使用這些方法向主類添加功能的支持類。

對於你的情況,你可能會考慮添加支持類如ImageFilters,或者甚至像ImageNormalizer那樣更窄的東西,如果你喜歡非常小的類。

+2

我不認爲「不幸」在這方面是一個合適的詞。 – bezmax 2012-04-05 08:43:18

+0

在少數情況下,它會很方便,比如內聯方法在編譯時調用的虛擬機代碼至關重要。 – 2012-04-05 08:47:46

1

不能跨文件拆分java類。你可以做的是,如果你的每個方法都是自包含的,你可以用靜態方法創建類。因此,在一定程度上,您需要做的只是剪切和粘貼代碼。

+0

我想過,但它對用戶不透明。然而,根據phlogratos的回答,我無論如何都做了這個,但是也在主類中做了委託方法,所以它變得透明。 – 2012-04-05 11:37:48

+0

@ Zom-B:是的,這就是爲什麼我在某種程度上提到過。然後你必須爲所有東西實現一個大的包裝類。 – npinti 2012-04-05 11:52:42

1

那麼,你可以創建一個更通用的類,並把更通用的方法,然後有ImageMatrix擴展那一個。另外,如果你有很多矩陣操作函數,你可能會得到很多代碼重複,也就是說,用不同的方法重複相同的代碼,而不是將普通代碼移動到aux方法並從不同的地方調用它等等。