Las diferencias entre StringBuilder
y StringBuffer
en Java están bien documentadas y han sido touched upon in StackOverflow también.¿Por qué no tener StringBuilder y StringBuffer implementando una interfaz común?
Básicamente, StringBuilder
es una copia no sincronizada de StringBuffer
, con prácticamente la misma interfaz, ya que fue pensada como un reemplazo directo más rápido para StringBuffer
. Su API es prácticamente idéntica y en realidad son subclases de la misma clase abstracta inaccesible en el JDK actual.
Lo único que me pregunto, por lo tanto, es por qué no están públicamente relacionados. Tener ambas clases implementando una interfaz común o incluso teniendo StringBuffer
como una subclase de StringBuilder
tendría sentido, permitiendo la existencia de código compartido para ambas clases.
¿Por qué esta separación forzada? ¿Era para que los programadores no mezclaran inadvertidamente thread-safe con código inseguro? ¿O fue solo un control de diseño que ahora será heredado hasta el final de la eternidad?
EDIT:
Para aclarar las cosas: puedo especular sobre por qué las cosas son así, pero estoy con la esperanza de referencias concretas a una decisión real, por ejemplo, durante un proceso de JSR. Cualquier cosa que arroje algo de luz sobre lo que, para mí, es una situación que ocasiona cierta cantidad de dificultad ocasionalmente.
EDIT 2:
El hecho de que ambas clases implementan Appendable
deslizó por completo mi mente. Probablemente porque esa interfaz en particular es inútil para la mayoría de los propósitos: solo puede agregar un solo carácter o un objeto preparado y eso es todo. En la mayoría de los casos, no es más útil que ambas clases son subclases de Object
.
Datos 3:
Bueno, aquí es la razón de ser exactamente esta pregunta desde a semi-official source:
Evaluación por el equipo de bibliotecas:
Es por diseño que StringBuffer y StringBuilder no comparte ningún supertipo público común. No están destinados a ser alternativas: uno es un error (StringBuffer), y el otro (StringBuilder) es su reemplazo .
Claramente, la falta de un supertipo común puede, en algunos casos, ralentizar la migración esperada de StringBuffer a StringBuilder. La otra cara de la moneda es que al agregar un supertipo común, estaríamos tomando los errores de nuestro pasado y consagrándolos en una interfaz pública para estar con nosotros durante todo el tiempo . Esto no solo ralentiza la migración: lo descarrila.
Existen métodos, p. append (long) que están en ambas clases pero ninguna de las interfaces. –
Aunque creo que como Vector y ArrayList extienden AbstractList, StringBuffer y StringBuilder podrían haber extendido una clase abstracta similar. No he buscado la última fuente, pero StringBuilder parecía ser una estafa directa de StringBuffer menos la sincronización. –
@MatthewFlaschen append() es de Appendable. –