2017-10-05 63 views
0

我有以下簡單的函數,它返回字符串數組中String的位置(String[])。如何將函數轉換爲擴展現有Java類的方法

private int getIndexOf(String needle, String[] haystack) { 
    int indexOfNeedle = -1; 
    for (int index=0;index<haystack.length;index++) { 
     if (haystack[index].equals(needle)) { 
      indexOfNeedle = index; 
      break; 
     } 
    } 
} 

我想轉換這是ArrayList類的方法,這樣我可以把它叫做:

String[] myArray = {"red","green","blue"}; 
int indexOfGreen = myArray.getIndexOf("green"); 

(我知道現在有一些圖書館,我可以包括包括indexOf但重塑這對我來說也是一個教訓。)

我相信這個方法會涉及到extends ArrayList,這可能是我需要擴展的類,所以我需要修改上面的函數以適應該擴展類。

而不是在方法版本中使用haystack,我也希望能夠在this內引用該方法被調用的數組對象進行搜索。

我也在想,我可能需要用這個新的擴展類數組替換我的String []數組(或者我可以使用重寫將我的新方法包含在Excited String Array類中?)。

正如我所說,這是爲了幫助我學習如何在Java中做到這一點,所以練習本身可能看起來有點沒有意義並且問題的關鍵並不是真正瞭解如何找到位置一個數組中的元素 - 這只是一個例子。

+5

數組不是數組列表。你不能將方法添加到數組中。而且這個代碼不會編譯。 –

+0

(注意:最簡單的方法是'Arrays.asList(haystack).indexOf(needle)')。 –

+1

「我相信這個方法會涉及到擴展ArrayList,」這幾乎*不是正確的答案。在課堂以外的方法中沒有任何傷害或犯規:將列表作爲參數進行搜索,可以將該方法應用於* any *列表,而不僅僅是您構建的特殊列表中的一個。換句話說,課堂以外的方法更具可重用性。 –

回答

1

(這個答案是基於意見,這不能不說的一個問題是關於擴展功能)

Java擴展功能

Java不允許擴展的功能,但也有可以使用的替代品而不是

替代

  • 結束語
    • 你可以有一個包含原始對象,並通過您要使用的現有的一類,而實施新的
  • 擴展
    • 可以擴展原始對象類型,但那麼這些實例必須是你的新類型,而不是原來的類型
    • 你只需要包含新的方法,其餘的傳遞給超類型

其他語言

一些其他JVM語言,如科特林做支持的擴展功能,但Java本身並不

+0

第二種選擇是我期待的,但第一種選擇也看起來很有趣。你能給出一個簡單的例子,說明每種實現這種方法的語法嗎?我搜索了一些例子,但是我發現的例子並沒有添加extesion方法。 –

0

不是一個好主意。

最佳實踐是在聲明中使用更一般的類型(接口)。

void f(List<String> list) { ... } 
List<String> list = new ArrayList<>(); 

這允許其他實現,並被用作參數更靈活/強大。

試圖擴展這些所有已知的類/接口將導致像新類重新包裝舊類等人爲因素。

改爲在實用程序類中使用靜態函數。像CollectionsArrays類。隨着binarySearch和其他好東西。

順便說一句,提到這樣的功能,可能是存在的,一個 想建立的,而不是重新發明 輪在現有的一般功能。

int index = Arrays.asList(haystack).indexOf(needle); 
+0

我想我需要閱讀一般的Java多一點來理解這個答案!這聽起來很不錯,但是我缺乏Java經驗意味着這個判斷在現階段不算太多 - 回到我猜的書。 –

+0

這實際上表明瞭一個很好的初學者的態度:我如何擴展我們都需要使用的工具類。但是,搜索經過驗證的類和方法並找到正確的工具會更好。而不是循環和索引,然後遇到Set和contains。 –