2011-12-06 3 views
8

No veo ningún inconveniente en hacer que String.indexOf sea parte de la interfaz CharSequence. El beneficio sería que otras clases como StringBuffer o StringBuilder tendrían que implementar los métodos indexOf también.¿Por qué el método String.indexOf no forma parte de la interfaz CharSequence?

¿Hay alguna razón de diseño por la que indexOf solo debe ser parte de String?

Gracias.

+0

Entonces, lo que estás preguntando es: ¿Por qué 'CharSequence' no tiene un método' indexOf'? –

+1

StringBuffer y StringBuilder tienen métodos indexOf, aunque ... – Thilo

+0

@Thilo - ¿Qué tipo de pregunta es por qué CharSequence no especifica ese comportamiento? (Y aunque java.nio.CharBuffer y javax.swing.text.Segment no implementan 'indexOf', podrían hacerlo fácilmente) –

Respuesta

7

No estoy seguro de cuál es el motivo, pero puedo dar un ejemplo de la clase que implementa CharSequence. Es java.nio.CharBuffer.

Teóricamente podría implementar indexOf() llamando al charAt() en bucle. Pero no funcionará como espera el usuario. No podemos distinguir entre 2 situaciones: el personaje aún no está allí y el personaje no está allí y no estará allí. En el segundo caso, indexOf() debe devolver -1 por contrato. En el primer caso, debería esperar hasta que lleguen todos los bytes. Pero CharBuffer pertenece a sin bloqueo IO, por lo que no puede bloquear.

Creo que esto explica al menos una de las posibles razones.

EDIT:

Siguiendo muy valiosa comentario de @Pacerier quiero añadir lo siguiente. IMHO CharSequence como una interfaz muy genérica que se utiliza en diferentes circunstancias. Los implementadores más conocidos de esta interfaz son String, StringBuffer y StringBuilder que contienen todo el contenido en la estructura de datos que permite el acceso directo a cualquier carácter. Sin embargo, esto está mal en el caso general. java.nio.CharBuffer es un ejemplo de tal caso.

+0

Eso es colocar el carro antes que el caballo. Usted simplemente argumentó que CharBuffer no debería ser una CharSequence, y que ese índice no debería estar en CharSequence. – Pacerier

+1

@Pacerier, gracias por tu comentario. Por favor, eche un vistazo además de mi respuesta que con suerte mueve el caballo hacia adelante. :) – AlexR

+0

Parece que debería haber (pero no hay tristeza) una interfaz separada que proporciona métodos indexOf() que implementan tanto String como StringBuilder, de modo que puede pasar a un método y llamar fácilmente a indexOf(). de eso –

3

Creo que es solo un descuido, ya que el funcionamiento de indexOf tiene sentido para cualquier tipo de secuencia.

2

Java 8 puede resolver algunos de estos problemas. Permitirá implementaciones predeterminadas en las interfaces. p.ej.

interface List { 
    void sort() default Collections.sort(this); 
} 

Esto permite que se agreguen métodos adicionales a las interfaces sin poner una carga en todos los implementadores para implementar ese método.

+0

¿Cómo funcionaría, por ejemplo, 'java.nio.CharBuffer' en el caso que AlexR menciona en su respuesta? Una implementación predeterminada de 'indexOf()' no resolvería el problema que menciona. – Jesper

+1

Si utiliza un método en un CharBuffer o StringBuilder o cualquier objeto mutable, no tiene un código de retorno para su 'falso ahora, pero podría ser cierto si cambia algo'. También podría ser "verdadero ahora pero falso si cambia algo", como los datos, la posición o el límite cambiados. Solo puede devolver verdadero/falso en función de lo que hay ahora. –

Cuestiones relacionadas