El problema es que no usaron la sintaxis C/C++. Creo que la sintaxis C es más legible. Ejemplo, si usted quiere tomar una subcadena con longitud de 2 a partir del 3er elemento de una lista de X, se escribe
X.subList(2,3).
En Java, si usted quiere tomar una sublista con solamente la tercera elemento de una lista de X, necesita escribir X.subList (2,3). Eso es realmente feo, parece que estás tomando una sublista de 2 elementos. Por otro lado, X.subList (2,2) es una lista vacía, bastante confusa.
int startIndex = calculateStartIndex();
int endIndex = calculateEndIndex();
X.subList(startIndex, endIndex);
En realidad, si (startIndex == endIndex) → lista vacía.
Su pregunta era: ¿por qué ?, así que aquí está mi respuesta. ¿Qué pasaría si ambos parámetros en Java fueran inclusivos? Tendría un problema cuando necesita tomar una lista vacía en caso de que calcule el segundo índice. Porque en la mayoría de los casos, los índices se calculan y no escribimos números directamente en las funciones.
Para tener una lista vacía, a menos que use una convención (ejemplo: en caso negativo o inferior endIndex return empty list) - pero dicha convención podría ocultar errores en la codificación (no hay diferencia si el segundo parámetro -1 o -100!):
int startIndex = calculateStartIndex(); // return 0
int endIndex = calculateEndIndex(); // return 0
X.subList(startIndex, endIndex); // this would return the 1st element of the list; how to get an empty list? Convenction needed!
// use a negative number to get empty list? And what if endIndex is negative because of a bug?
I este caso, C gana; más legible en cualquier caso, es una pena que hayan cambiado eso. Pero esto es solo un comentario adicional que puedes hacer.
+1 por la segunda razón –
¿Qué función C lo hace de esta manera? –
No es cierto que substr en C/C++ funcione como Java. substr en C toma una longitud como segundo parámetro, por lo que substr (3,2) significa "take 2 chars starting from the char with index 3". Creo que la sintaxis C es más legible. – fresko