支持indexOf方法的CharSequence实现

4

在我的程序中,我使用了大量的字符串和StringBuilder。我想摆脱StringBuilder toString()方法,并始终使用CharSequence。但是,我需要访问indexOf方法(该方法在StringBuilder和String中都可用,但在其他实现中不可用)。我应该如何实现一个接口,使这个函数可以被调用?

3个回答

3

好的,您可以通过为已知类型硬编码测试并在其他情况下“手动”执行来轻松地完成此操作:

public static int indexOf(CharSequence input, String needle) {
    if (input instanceof String) {
        String text = (String) input;
        return text.indexOf(needle);
    }
    if (input instanceof StringBuilder) {
        StringBuilder text = (StringBuilder) input;
        return text.indexOf(needle);
    }
    // TODO: Do this without calling toString() :)
    return input.toString().indexOf(needle);
}

在硬编码类型方面,这样做看起来相当丑陋,但它能够运行。


我猜到了我需要做什么,只是觉得这样做很丑陋,想知道是否有其他的方法。谢谢。 - killachaos

2

TextUtils类在哪里,即需要哪个import - U. Windl
import android.text.TextUtils; - Ian Lovejoy
请记住,不是所有的Java程序都是Android应用程序。 - quartzsaber

-1
一个想法是创建一个类,为每种类型提供多个静态实现。
public class Strings{

    public static int indexOf(String input, String c){
        return input.indexOf(c);
    }

    public static int indexOf(StringBuilder input, String c){
        return input.indexOf(c);
    }

    public static int indexOf(YourClass input, String c){
        return input.indexOf(c);
    }
}

这样,您可以为每个具有实现的类型调用Strings.indexOf(whatever)。这将通过让编译器/jvm选择要使用的方法来使您的代码保持清洁。


如果input的类型是YourClass,并且没有indexOf()方法可用,那么这如何帮助(第三种情况)? - U. Windl
只有在构建时已知(并使用)具体类型时,此方法才有效。如果在构建时您唯一知道的是它是某个CharSequence实现,那么重载将无法帮助您,您将不得不像Jon Skeet的答案一样使用instanceof。 - Evgeniy Berezovsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接