为什么Java开发人员没有创建一个类$this->get('your_service')->callMeTheWayYouWant($vendorId, $vendor);
并将其重命名为AbstractStringBuilder
?
StringBuilder
中的方法:
AbstractStringBuilder
和public AbstractStringBuilder append(double d) {
FloatingDecimal.appendTo(d,this);
return this;
}
中的方法:
StringBuilder
我想我们只能在@Override
public StringBuilder append(double d) {
super.append(d);
return this;
}
中保留一种方法,它会正常工作。创建无用的包装器AbstractStringBuilder
有什么意义?
答案 0 :(得分:4)
由于AbstractStringBuilder
不是public class
,因此没有问开发人员为什么写它,人们只能猜测...
<强>投机强>
请注意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;
}
并在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;
}
我们看到,线程安全版本和非线程安全版本之间的唯一区别是一些缓存控制(toStringCache
),但它们都在其超类中调用相同的方法,因此通过继承重用代码
<强>类比强>
把它想象成你是一个编写代码的人。您创建了一个类dog
,其中包括狗的解剖结构(耳朵,尾巴,4条腿......)以及与其动作相关的方法,如bark
。 5年后,您想要创建一个类cat
来代表一只猫。你会从头开始吗?不,你会创建一个abstract class FourLeggedAnimal
,其结构为耳朵,尾巴,4条腿等,并使用方法makeSound
。然后,您将扩展此类并在两个子类中使用所有这些相似性,并在必要时覆盖(bark
和meow
)。
问
创建无用的包装器StringBuilder有什么意义?
与有人问你一样
创建无用的包装Cat有什么意义?