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

9cbw7uwe  于 2021-08-20  发布在  Java
关注(0)|答案(3)|浏览(357)

大概是这样的:

MyFixedLengthStringBuilder sb = new MyFixedLengthStringBuilder(2);
sb.append("123"); // <=== throws ArrayIndexOfOutBoundsException!

其余的将完全相同。基本上我需要一个 StringBuilder 那永远不会成长。
我明白了 StringBuilder 是最终的,因此不能扩展。代表团似乎是我唯一的途径。你有没有看到我需要的其他方法/想法/解决方案?

dojqjjoe

dojqjjoe1#

如果我可以创建自己的类,它会像这样,并且根据需求可以添加更多的东西

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

}
rur96b6h

rur96b6h2#

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

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, 0,3);
        execute(sb::replace,0,1,"I");
        execute(sb::insert, 1, " 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,R,S> void execute(
            TriConsumer<T, R, S> triCon,
            T index, 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的大小。

dw1jzc5e

dw1jzc5e3#

首先,客户需求没有得到充分的说明:他们是否请求一个与赋值兼容的类 StringBuilder 或者他们只是请求一个具有特定功能的类?
前者在技术上是不可能的,因为 StringBuilder 声明为 final ,因此任何类型的变量 StringBuilder 都会有同样的行为。
后者允许您使用自己的方法指定自己的新类。至于要求,客户可能会指定“我只需要从 StringBuilder ,因为他们没有费心去精确地检查他们需要什么。我认为,如果双方都投入一些工作来缩小需求范围,那么很可能您将能够使用一些适合客户需求的方法来创建一个类。
是的,正如你已经提到的,在这种情况下,使用一篇与原作结合的作文是一个好主意 StringBuilder 班级。
当您要求进行黑客攻击时,理论上您可以编写自己的 java.lang.StringBuilder 并提供一个定制 ClassLoader 这将加载您的实现,而不是标准的java实现。不过,我希望这显然不是一个好的做法。

相关问题