Le differenze tra StringBuilder
e StringBuffer
in Java sono ben documentate e sono state anche touched upon in StackOverflow.Perché non avere StringBuilder e StringBuffer implementano un'interfaccia comune?
Fondamentalmente, StringBuilder
è una copia non sincronizzata di StringBuffer
, con praticamente la stessa interfaccia in quanto è stata concepita come una sostituzione drop-in più rapida per StringBuffer
. La loro API è praticamente identica e in realtà sono sottoclassi della stessa inaccessibile classe nell'attuale JDK.
L'unica cosa che mi chiedo, quindi, è il motivo per cui non sono pubblicamente correlati. Avere entrambe le classi implementare un'interfaccia comune o anche avere StringBuffer
come sottoclasse di StringBuilder
avrebbe senso, consentendo l'esistenza di codice condiviso per entrambe le classi.
Quindi, perché questa separazione forzata? Era così che i programmatori non avrebbero inavvertitamente mescolato thread-safe con codice thread-safe? O era solo una supervisione del design che ora verrà ereditata fino alla fine dell'eternità?
EDIT:
di fare chiarezza: posso speculare sul perché le cose sono come questo, ma sto sperando di riferimenti concreti ad una decisione vera e propria, per esempio durante un processo JSR. Tutto ciò che potrebbe far luce su cosa, per me, è una situazione che causa occasionalmente una certa difficoltà.
EDIT 2:
Il fatto che entrambe le classi implementano Appendable
completamente passato di mente. Probabilmente perché quella particolare interfaccia è inutile per la maggior parte degli scopi - può solo aggiungere un singolo carattere o un oggetto preparato e il gioco è fatto. Nella maggior parte dei casi non è più utile che entrambe le classi siano sottoclassi di Object
.
EDIT 3:
Bene, qui è la spiegazione razionale per esattamente questa domanda da a semi-official source:
di valutazione da parte del team biblioteche:
E 'di design che StringBuffer e StringBuilder condividere nessun supertipo pubblico comune . Non sono pensati per essere alternativi: uno è un errore (StringBuffer) e l'altro (StringBuilder) è la sua sostituzione .
Chiaramente la mancanza di un supertipo comune può, in alcuni casi, rallentare la migrazione sperata di da StringBuffer a StringBuilder. Il rovescio della medaglia è che aggiungendo un supertipo comune, dovremmo prendere gli errori del nostro passato e archiviarli in un'interfaccia pubblica per stare con noi per tutto il tempo . Questo non rallenta semplicemente la migrazione: lo fa deragliare.
Esistono metodi, ad es. append (long) che si trovano in entrambe le classi ma nessuna delle interfacce. –
Anche se penso che il modo in cui Vector e ArrayList estendano AbstractList, StringBuffer e StringBuilder potrebbero aver esteso una classe astratta simile. Non ho guardato l'ultima fonte, ma il StringBuilder sembrava essere un vero furto di StringBuffer meno la sincronizzazione. –
@MatthewFlaschen append() è da Appendable. –