【问题标题】:How to write Unified code for StringBuffer and StringBuilder in java 6如何在 java 6 中为 StringBuffer 和 StringBuilder 编写统一代码
【发布时间】:2017-01-19 10:34:08
【问题描述】:

我有以下重复的代码,我只想写一次(请注意,这只是我想要实现的示例):

public class A {
    public void doSomething(StringBuffer additional, int start, int end) {
        try {
            StringBuilder strBuilder = callMethodA();
            strBuilder.append(additional, start, end);
            B.doSomething(strBuilder, additional, start, end);             
        } catch (Exception e) {
            // do something
        }
    }

    public void doSomething(StringBuilder additional, int start, int end) {
        try {
            StringBuilder strBuilder = callMethodA();
            strBuilder.append(additional, start, end);
            B.doSomething(strBuilder, additional, start, end);             
        } catch (Exception e) {
            // do something
        }
    }
    ...
}

public class B {
    public static void doSomething(StringBuilder strBuilder, 
                     StringBuilder additional, int start, int end) { 
             // Do some code specific to "additional" StringBuilder
             ...
    }

    public static void doSomething(StringBuilder strBuilder, 
                     StringBuffer additional, int start, int end) {...}
             // Do some code specific to "additional" StringBuffer
             ...
}

如您所见,代码是相同的,除了“additional”参数在类A的第一个方法StringBuilder和第二个@987654325 @。 如何修改我的代码以避免重复? B 类中的逻辑对于 StringBufferStringBuilder 是不同的。 我不能使用AbstractStringBuilder,因为它是一个受保护的类。 我正在使用 Java 6。

谢谢

【问题讨论】:

  • "B 类中的逻辑对于 StringBuffer 和 StringBuilder 是不同的。"有什么不同?
  • 例如,如果我想在 StringBuilder 的情况下创建一个新的 StringBuilder,在 StringBuffer 的情况下创建一个新的 StringBuffer。
  • @RC。我的意思是她的算法的不同之处在于需要使用这两个类并且显然是必不可少的。
  • @Kayaman 哎呀,我以为这是 OP 评论。如果 OP 真的真的(我的意思是真的)需要StringBuffer(我也怀疑)那么答案可能是一些包装器和一个通用接口

标签: java stringbuilder stringbuffer


【解决方案1】:

不如在A类中使用Appendable接口同时接受StringBuilder和StringBuffer,然后在B类中使用instanceof来检查类型。像这样:

public class A {
    public void doSomething(Appendable additional, int start, int end) {
        try {
            StringBuilder strBuilder = callMethodA();
            strBuilder.append(additional.toString(), start, end);
            B.doSomething(strBuilder, additional, start, end);             
        } catch (Exception e) {
            // do something
        }
    }
}

public class B {
    public static void doSomething(StringBuilder strBuilder, Appendable additional, int start, int end) {
        if (additional instanceof StringBuilder) {
            // Do some code specific to "additional" StringBuilder
        } else if (additional instanceof StringBuffer) {
            // Do some code specific to "additional" StringBuffer
        }
    }
}

编辑:老实说,Appendable 接口并不是真正需要的,因为只应用了 toString 函数,它也可能只是一个对象。如果你只想在你的函数中接受 StringBuilders 和 StringBuffers,你可以重载 doSomething 函数,并使接受 Appendable(或 Object,如果你喜欢)私有的 doSomething 函数。

【讨论】:

    【解决方案2】:

    由于 StringBuffer 和 StringBuilder 不相关,我能想到的唯一解决方案是这样的:

    public void doSomething(StringBuffer additional, int start, int end) {
        StringBuilder ad = new StringBuilder(additional);
        doSomething(ad, start, end);
        additional.replace(0, additional.length(), ad.toString());
    }
    

    【讨论】:

    • 谢谢,但由于我必须为每个操作执行不同的操作,这在我的情况下不起作用。
    猜你喜欢
    • 2011-02-27
    • 2023-04-10
    • 2017-08-23
    • 2023-04-04
    • 1970-01-01
    • 2017-05-27
    • 2010-09-26
    • 2011-04-16
    相关资源
    最近更新 更多