微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java中是否有一个类似于StringBuilder的类,唯一的区别是它的长度是固定的?

如何解决java中是否有一个类似于StringBuilder的类,唯一的区别是它的长度是固定的?

像这样:

let text = "";
const fruits = ["apple","orange","cherry"];
fruits.forEach(myFunction);
 
function myFunction(item,index) {
  text += index + ": " + item + " "; 
}

console.log(text)
//=> 0: apple 1: orange 2: cherry

其余的将完全相同。基本上我需要一个永远不会增长的 MyFixedLengthStringBuilder sb = new MyFixedLengthStringBuilder(2); sb.append("123"); // <=== throws ArrayIndexOfOutBoundsException!

我看到 StringBuilderfinal 所以它不能被扩展。委托听起来是我在这里的唯一途径。你看到我需要的任何其他黑客/想法/解决方案吗?

解决方法

你可以这样。您仍然需要一些重载方法来处理不同的参数计数和类型,但它不必是完整的委托。这只是一个简单的例子。它可以工作到一个班级。编辑:修改为处理大多数方法。

interface TriConsumer<T,R,S> {
      public void accept(T t,R r,S s);
}
public class StringBuilderSol {
    static int size = 20;
    static StringBuilder sb = new StringBuilder(size);
    
    
    public static void main(String[] args) {

        execute(sb::append,"This is fun!");
        System.out.println(sb);
        execute(sb::append,"Java!");
        System.out.println(sb);
        execute(sb::delete,3);
        execute(sb::replace,1,"I");
        execute(sb::insert," like ");
        execute(sb::delete,7,15);
        System.out.println(sb);
        execute(sb::append,"time to crash");
        
    }
    
    public static <T> void execute(Consumer<T> con,T v) {
        con.accept(v);
        checkLength();
    }
    
    public static <T,R> void execute(
            BiConsumer<T,R> biCon,T index,R val) {
        biCon.accept(index,val);
        checkLength();
    }

    public static <T,S> void execute(
            TriConsumer<T,S> triCon,R arg1,S arg2) {
        triCon.accept(index,arg1,arg2);
        checkLength();
    }
    
    public static void checkLength() {
        if (sb.length() > size) {
            throw new IndexOutOfBoundsException();
        }
    }

}

印刷品

This is fun!
This is fun!Java!
I like Java!
Exception in thread "main" java.lang.IndexOutOfBoundsException
    at stackOverflow.StringBuilderSol.checkLength(StringBuilderSol.java:50)
    at stackOverflow.StringBuilderSol.execute(StringBuilderSol.java:32)
    at stackOverflow.StringBuilderSol.main(StringBuilderSol.java:25)


另一种选择(但有其自身的问题)是设置一个计时器来定期检查 StringBuilder 的大小。

,

如果我可以创建自己的类,它将是这样的,并且可以根据需求添加更多内容

public class MyFixedLengthStringBuilder {

    StringBuilder sb;
    int size;
    
    public MyFixedLengthStringBuilder(int size) {
        if(size < 0)
            throw new IllegalArgumentException();
        this.size = size;
        sb = new StringBuilder(size);
    }
    
    public void append(String str) {
        sb.append(str);
        if(sb.length() > size) {
            sb.setLength(size);
            throw new ArrayIndexOutOfBoundsException();
        }
    }
    
}
,

首先,客户需求没有得到充分说明:他们是请求一个与 StringBuilder 赋值兼容的类,还是只是请求一个具有特定功能的类?

前者在技术上是不可能的,因为 StringBuilder 被声明为 final,因此任何 StringBuilder 类型的变量将始终具有相同的行为。

后者允许您使用自己的方法指定自己的新类。至于需求,客户可能会指定“我只需要 StringBuilder 中的所有东西。”,因为他们没有费心去实际准确地检查他们需要什么。我认为,如果你们俩都投入一些工作来缩小需求范围,那么您很有可能只用几种方法来制作一个满足客户需求的类。

是的,正如您已经提到的,在这种情况下,最好使用具有原始 StringBuilder 类的组合。


当您要求 hack 时,理论上您可以编写自己的 java.lang.StringBuilder 实现并提供自定义 ClassLoader 来加载您的实现,而不是标准的 java 实现。不过,我希望这显然不是一个好的做法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。