La interfaz java.util.List
no es compatible con getLast()
porque los diseñadores optaron por una "interfaz mínima". Con la cantidad mínima de métodos definidos, hace que sea más fácil de entender y más rápido de aprender.
Esto está en contraste con una 'interfaz humana' (como la utilizada en el Ruby array class) que intenta proporcionar métodos para realizar operaciones comunes (por ejemplo, getLast()
). Como hay muchos usos que un concepto tan fundamental como una lista se puede poner a esto tiende a conducir a interfaces mucho más grandes.
Para obtener más información, consulte las descripciones de Martin Fowler Minimal Interface y Humane Interface.
cuanto a por qué ListaEnlazada apoya getLast()
etc., por citar el javadoc:
... la clase LinkedList proporciona uniformemente nombrado métodos para obtener, extraer e insertar un elemento al principio y al final de la lista .Estas operaciones permiten que las listas vinculadas se usen como una pila, una cola o una cola de doble extremo (deque).
Presumiblemente se pensó que una Lista general no sería adecuada para estos casos de uso específicos.
Como una idea de la mente del principal diseñador de la API de colecciones de Java (Joshua Bloch) proporciona this list of API design maxims con el que trabaja. De los cuales, los más pertinentes a esta pregunta son:
Los primeros borradores de las API deben ser cortos, generalmente una página con las firmas de clase y método y las descripciones de una línea. Esto facilita la reestructuración de la API cuando no la haces bien la primera vez.
En caso de duda, déjalo fuera. Si hay un teorema fundamental del diseño de API, esto es todo. Se aplica por igual a la funcionalidad, clases, métodos y parámetros. Cada faceta de una API debe ser lo más pequeña posible, pero no más pequeña. Siempre puede agregar cosas más tarde, pero no puede llevárselas. Minimizar el peso conceptual es más importante que el conteo de clase o método.
Mantenga las API sin detalles de implementaciones. Confunden a los usuarios e inhiben la flexibilidad para evolucionar. No siempre es obvio cuál es un detalle de implementación: tenga cuidado con la sobreespecificación.
Minimiza el acceso; cuando tengas dudas, hazlo en privado. Esto simplifica las API y reduce el acoplamiento.
Tenga en cuenta las consecuencias de rendimiento de las decisiones de diseño de API, pero no deformar una API para lograr mejoras de rendimiento. Afortunadamente, las buenas API generalmente se prestan para implementaciones rápidas.
Sin embargo, también afirma:
No haga el cliente hace nada la biblioteca podría hacer. La violación de esta regla conduce a un código repetitivo en el cliente, que es molesto y propenso a errores.
Lo que acaba de mostrar que las directrices de diseño a menudo entran en conflicto y la parte más difícil de un trabajo de diseñadores de API es equilibrar estos conflictos.
Después de tratarlo varias veces en el código, estoy bastante seguro de que es así solo para que los programadores de mantenimiento se enojen con el diseñador de la API. :-) Los programadores de Greenfield terminan pasando LinkedList (en lugar de List) para que puedan usar getLast().Los chicos de mantenimiento descubren que ArrayList es más apropiado y tienen que lidiar con todas estas LinkedLists especificadas que realmente deberían haber sido List en primer lugar (y probablemente lo hubieran sido a excepción de esta crítica falla en la interfaz List) ... –