【问题标题】:indexOf on CharSequence implementations that support it支持它的 CharSequence 实现上的 indexOf
【发布时间】:2011-08-07 12:24:07
【问题描述】:

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

【问题讨论】:

    标签: java oop indexof


    【解决方案1】:

    好吧,您可以通过对已知类型的测试进行硬编码来相当容易地做到这一点,否则可以“手动”完成:

    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);
    }
    

    就类型的硬编码而言,这非常难看,但它会起作用。

    【讨论】:

    • 我猜到我必须要做的,我只是觉得它也很丑,想知道是否有不同的方法。谢谢。
    【解决方案2】:

    您可以使用TextUtils中的默认方法:indexOf

    【讨论】:

    • TextUtils 类在哪里,即:需要哪个import
    • import android.text.TextUtils;
    • 请记住,并非所有 Java 程序都是 Android 应用程序。
    【解决方案3】:

    一种想法是为每个类型创建一个具有多个静态实现的类。

    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 选择为您使用的方法,这将使您的代码保持干净。

    【讨论】:

    • 如果inputYourClass 类型,并且没有indexOf(),这有什么帮助(第三种情况)?
    • 这仅适用于在构建时已知(并使用)具体类型的情况。如果在构建时您唯一知道的是它是一些 CharSequence 实现,那么重载对您没有帮助,您将不得不使用 instanceof,就像 Jon Skeet 的答案一样。
    猜你喜欢
    • 2011-12-09
    • 2020-08-13
    • 1970-01-01
    • 2012-02-09
    • 2012-04-03
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2013-07-01
    相关资源
    最近更新 更多