Hasta que el autor de Java de string.indexOf
nos cuenta la historia real ...
Supongamos que hemos tenido que diseñar desde cero, algunas restricciones de diseño obvias para este problema:
indexOf
deben devolver una valor numérico, de modo que cuando se encuentra una coincidencia, usted sabe dónde está
- , los índices válidos son siempre enteros
- Los índices de matriz (y cadena) están basados en cero en Java
- Java es fuertemente tipado
- el entero tipos numéricos son firmados en Java
Dadas estas restricciones básicas, algunas de las posibles opciones para la devolución de la función escriba el sería número entero (lo ideal es de un tipo lo suficientemente grande como para representar la último índice en la cadena más grande posible), O ... Object
(y quizás devuelva nulo para indicar que no se encontró).Pero en la práctica, devolver Object
no sería ni eficiente ni fácil de usar, debido a la necesidad de verificar su validez y descartar antes del uso para el caso encontrado, ¡así que no es realmente una opción viable!
Así que vamos con un número entero. ¿Deseamos lanzar una excepción si no se encuentra? Lanzar excepciones tiene múltiples problemas propios: crear objetos de excepción y saltar a manejadores de excepciones puede ser bastante ineficiente, y escribir bloques try/catch alrededor de las llamadas indexOf
tampoco es divertido.
Digamos que lo hemos reducido: tiene que devolver un tipo entero (con signo) y no arrojar una excepción. Ahora, ¿qué valor entero debería volver a representar no encontrado?
Para permitir la búsqueda en cadenas lo más grandes posible, debemos reservar todos los enteros positivos para su uso con el fin de encontrarlos correctamente. Por el contrario, ninguno de los números negativos es necesario para representar un índice "encontrado", por lo que todos están potencialmente disponibles para su uso como códigos de retorno que representan "no encontrado".
Si pudiéramos haber elegido cualquier número negativo, representar no encontrado, o simplemente decir "todos los valores negativos de retorno significan no encontrarlo", haría el trabajo ... ¿Pero sería el mejor diseño?
¿Cuáles son algunas razones para usar -1 en lugar de otros números negativos? Mis razones favoritas son simplemente '-1, es fácil de recordar para todos, y puedes hacer pruebas de igualdad exactas sobre él'. (En lugar de verse obligado a usar las desigualdades y pensar en problemas uno por uno, como si desea menos que o menos que o igual, y con qué valor comparar, cero o uno negativo)
I también a veces admiro la razón de Chris de que (parafraseando) 'funciona muy bien con substring(foundIndex + 1)
'.
Como puede ver en las respuestas, nadie piensa que debería ser una excepción. Pregúntate a ti mismo, si devuelve Integer en lugar de int, esperarías que devuelva null o lanzar una excepción. Dado que es una primitiva, null no está disponible como un tipo de retorno, por lo que se usa -1 en su lugar. – Robin
si devuelve un objeto Integer. nulo es posible. consulte MSFT.net 2.0, int? es una buena solución – ariso