如何将函数转换为扩展现有Java类的方法

时间:2017-10-05 07:56:44

标签: java

我有以下简单函数返回字符串数组StringString[]的位置。

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 []数组(或者我可以使用覆盖来将我的新方法包含在激活的String Array类中吗?)。 / p>

正如我所说的,这是为了帮助我学习如何在Java中一般地完成这项工作,因此练习本身可能看起来有点无意义,问题的关键点并非如此。学习如何在数组中找到元素的位置 - 这仅仅是一个例子。

2 个答案:

答案 0 :(得分:1)

(此答案基于评论,其中说的是关于扩展功能的问题)

Java扩展函数

Java不允许扩展功能,但您可以使用替代

替代

  • 包装
    • 您可以拥有一个包含原始对象的类,并在实现新的对象时传递您要使用的现有对象
  • 扩展
    • 您可以扩展原始对象类型,但实例必须是您的新类型,而不是原始类型
    • 您只需要包含新方法,其余传递给超类型

其他语言

其他一些JVM语言,如Kotlin,确实支持扩展功能,但Java本身不支持

答案 1 :(得分:0)

不是一个好主意。

最佳做法是在声明中使用更通用的类型(接口)。

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

这允许其他实现,并且用作参数更灵活/更强大。

尝试扩展这些所有已知的类/接口将导致诸如使用新类重新包装旧类等伪像,等等。

而是在实用程序类中使用静态函数。与CollectionsArrays类一样。使用binarySearch和其他好东西。

顺便说一下,提到的功能可能存在,而且可能存在 我希望建立在现有的一般功能上,而不是重新发明 轮子。

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