Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建AbstractStringBuilder和StringBuilder的目的是什么?_Java_Stringbuilder - Fatal编程技术网

Java 创建AbstractStringBuilder和StringBuilder的目的是什么?

Java 创建AbstractStringBuilder和StringBuilder的目的是什么?,java,stringbuilder,Java,Stringbuilder,为什么Java开发人员没有创建一个类,AbstractStringBuilder,并将其重命名为StringBuilder e、 例如,AbstractStringBuilder中的方法: public AbstractStringBuilder append(double d) { FloatingDecimal.appendTo(d,this); return this; } @Override public StringBuilder append(double d) {

为什么Java开发人员没有创建一个类,
AbstractStringBuilder
,并将其重命名为
StringBuilder

e、 例如,
AbstractStringBuilder
中的方法:

public AbstractStringBuilder append(double d) {
    FloatingDecimal.appendTo(d,this);
    return this;
}
@Override
public StringBuilder append(double d) {
    super.append(d);
    return this;
}
以及
StringBuilder
中的方法:

public AbstractStringBuilder append(double d) {
    FloatingDecimal.appendTo(d,this);
    return this;
}
@Override
public StringBuilder append(double d) {
    super.append(d);
    return this;
}

我想我们只能在
AbstractStringBuilder
中保留一个方法,它会很好地工作。既然
AbstractStringBuilder
不是一个
公共类
,除了询问开发人员为什么编写它之外,我们只能推测

投机

请注意,
StringBuffer

线程安全、可变的字符序列

是在1.0中添加的<代码>StringBuilder的Javadoc读取

可变的字符序列。此类提供与
StringBuffer
兼容的API,但不保证同步此类设计用于在单个线程(通常情况下)使用字符串缓冲区的地方作为
StringBuffer
的插入式替换。在可能的情况下,建议优先使用该类,而不要使用
StringBuffer
,因为在大多数实现中,它会更快

(强调矿山)并添加到1.5中。这个类在大多数情况下是对
StringBuffer
的改进,但总体上功能非常相似(可以相互替换)。正如@immibis和@MadProgrammer在评论中所指出的,在需要类似功能的情况下,继承的思想可以省去很多麻烦

我在方法
append(String
)中找到了一个简单的例子。在
StringBuilder
中,它是

@Override
public StringBuilder append(String str) {
    super.append(str);
    return this;
}
StringBuffer

@Override
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}
public AbstractStringBuilder append(String str) {
    if (str == null)
        return appendNull();
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}
AbstractStringBuilder

@Override
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}
public AbstractStringBuilder append(String str) {
    if (str == null)
        return appendNull();
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}
我们看到的是线程安全版本和非线程安全版本之间的唯一区别是一些缓存控制(
toStringCache
),但它们都在其超类中调用相同的方法,因此通过继承重用代码

类比

把它想象成是你在写代码。您可以创建一个类
dog
,其中包括狗的解剖结构(耳朵、尾巴、4条腿…)以及与其动作相关的方法,如
吠叫
。5年后,您希望创建一个类
cat
来表示一个cat。你能从头开始吗?不,您将创建一个
抽象类FourLeggedAnimal
,其结构为耳朵、尾巴、4条腿等,并使用方法
makeSound
。然后,您将扩展该类并在两个子类中使用所有这些相似性,必要时覆盖(
bark
meow

询问

创建无用的包装器StringBuilder有什么意义

就跟有人问你一样

创建无用的包装猫有什么意义


简短回答:因此
StringBuffer
也可以对其进行扩展。创建抽象类通常是为了提供一个基础,其他实现可以从中进行扩展,而无需提供大量的模板或重复代码。有可能StringBuilder中的append(double)方法最初的实现方式有所不同,并且随着时间的推移而发生了更改。Afaik,
StringBuffer
首先出现,然后他们想要添加
StringBuilder
。因此,他们可能将所有代码从
StringBuffer
移动到
AbstractStringBuilder
,然后让它扩展,然后让
StringBuilder
也扩展它。这个非常好的答案的关键思想是。。。“五年后,你现在想要。”(而且,你想在不破坏大量现有代码和/或迫使所有代码重新验证的情况下完成它。你没有编写原始代码。确实被面包车撞倒的家伙。你几乎没有时间可靠地完成这项工作。)抽象类以前不存在,因为没有必要。添加它,特别是作为实现
cat
的连接点,是在此类(遗留…)程序中移植新功能的一种非常安全的方法。@MikeRobinson非常正确,尽管即使您确实编写了原始类并且有很多时间,它仍然是正确的方法(或者至少是正确的方法)。不幸的是,在其他JDK领域,情况并非总是如此。