Java 创建AbstractStringBuilder和StringBuilder的目的是什么?
为什么Java开发人员没有创建一个类,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) {
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领域,情况并非总是如此。