Dmi*_*405 3 java stringbuilder
Java开发人员为什么不创建一个类AbstractStringBuilder并将其重命名为StringBuilder?
例如,以下方法AbstractStringBuilder:
public AbstractStringBuilder append(double d) {
FloatingDecimal.appendTo(d,this);
return this;
}
Run Code Online (Sandbox Code Playgroud)
和中的方法StringBuilder:
@Override
public StringBuilder append(double d) {
super.append(d);
return this;
}
Run Code Online (Sandbox Code Playgroud)
我想我们只能保留一种方法AbstractStringBuilder,它将很好地工作。创建无用包装的目的是StringBuilder什么?
既然AbstractStringBuilder不是public class,就不问开发人员为什么要编写它了,所以只能推测...
投机
请注意StringBuffer,
线程安全的可变字符序列。
在1.0中添加。StringBuilder的Javadoc读取
可变的字符序列。此类提供了与兼容的API
StringBuffer,但不保证同步。此类设计为在StringBuffer单线程正在使用字符串缓冲区的位置(通常是这种情况)中使用的替代产品。在可能的情况下,建议优先使用此类,StringBuffer因为在大多数实现中它将更快。
(强调我的)并添加到1.5中。这个想法是,StringBuffer在大多数情况下该类是一个改进,但是总体上在功能上非常相似(可以相互替换)。正如@immibis和@MadProgrammer在评论中指出的那样,在您想要类似功能的情况下,继承的思想为您节省了很多麻烦。
我在)中找到了一个简单的例子append(String。在中StringBuilder,它是
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
Run Code Online (Sandbox Code Playgroud)
在StringBuffer里面
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
Run Code Online (Sandbox Code Playgroud)
在AbstractStringBuilder里面
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;
}
Run Code Online (Sandbox Code Playgroud)
我们看到的是,线程安全版本和非线程安全版本之间的唯一区别是某些缓存控件(toStringCache),但是它们都在其超类中调用了相同的方法,因此通过继承重用了代码。
比喻
认为它就像您是一个编写代码的人。您将创建一个类dog,其中包括狗的解剖结构(耳朵,尾巴,4条腿...)以及与其行为相关的方法,例如bark。5年后,您要创建一个cat代表猫的类。你会从头开始吗?不,您将abstract class FourLeggedAnimal使用耳朵,尾巴,4条腿等的结构以及方法创建一个makeSound。然后,您将扩展该类并在两个子类中使用所有这些相似之处,并在必要时(bark和meow)覆盖。
询问
创建无用的包装器StringBuilder有什么意义?
会和有人问你的一样
创建无用的包装猫有什么意义?
| 归档时间: |
|
| 查看次数: |
922 次 |
| 最近记录: |