thomas programación programacion orientada objetos libro lenguaje introducción fundamentos desde con codigos cero algoritmos java extension-methods

programación - Java equivalente a los métodos de extensión C#



libro de programacion en java netbeans pdf (11)

Estoy buscando implementar una funcionalidad en una lista de objetos como lo haría en C # usando un método de extensión.

Algo como esto:

List<DataObject> list; // ... List initialization. list.getData(id);

¿Cómo hago eso en Java?


El lenguaje XTend , que es un superconjunto de Java y compila el código fuente 1 Java, lo admite.


Java no es compatible con los métodos de extensión.

En cambio, puede hacer un método estático regular o escribir su propia clase.


Java no tiene esa característica. En su lugar, puede crear una subclase regular de su implementación de lista o crear una clase interna anónima:

List<String> list = new ArrayList<String>() { public String getData() { return ""; // add your implementation here. } };

El problema es llamar a este método. Puedes hacerlo "en el lugar":

new ArrayList<String>() { public String getData() { return ""; // add your implementation here. } }.getData();


Los métodos de extensión no son solo métodos estáticos y no solo azúcar de sintaxis de conveniencia, de hecho son una herramienta bastante poderosa. Lo principal es la capacidad de anular diferentes métodos en función de la instanciación de parámetros de genéricos diferentes. Esto es similar a las clases de tipos de Haskell, y de hecho, parece que están en C # para soportar Mónadas de C # (es decir, LINQ). Incluso dejando caer la sintaxis de LINQ, todavía no sé cómo implementar interfaces similares en Java.

Y no creo que sea posible implementarlos en Java, debido a la semántica de borrado de tipos de Java de los parámetros genéricos.


Otra opción es usar clases ForwardingXXX de la biblioteca google-guava.


Parece que existe una pequeña posibilidad de que los Métodos Defender (es decir, los métodos por defecto) puedan convertirse en Java 8. Sin embargo, hasta donde yo los entiendo, solo permiten al autor de una interface extenderla de forma retroactiva, no a usuarios arbitrarios.

Defender Methods + Interface Injection podría implementar completamente los métodos de extensión de estilo C #, pero AFAICS, Interface Injection aún no está en la hoja de ruta de Java 8.


Un poco tarde para la fiesta sobre esta cuestión, pero en caso de que alguien lo encuentre útil, acabo de crear una subclase:

public class ArrayList2<T> extends ArrayList<T> { private static final long serialVersionUID = 1L; public T getLast() { if (this.isEmpty()) { return null; } else { return this.get(this.size() - 1); } } }


Uno podría usar el patrón de diseño orientado a objetos del decorador . Un ejemplo de este patrón que se utiliza en la biblioteca estándar de Java sería el DataOutputStream .

Aquí hay un código para aumentar la funcionalidad de una lista:

public class ListDecorator<E> implements List<E> { public final List<E> wrapee; public ListDecorator(List<E> wrapee) { this.wrapee = wrapee; } // implementation of all the list''s methods here... public <R> ListDecorator<R> map(Transform<E,R> transformer) { ArrayList<R> result = new ArrayList<R>(size()); for (E element : this) { R transformed = transformer.transform(element); result.add(transformed); } return new ListDecorator<R>(result); } }

PD. Soy un gran fan de Kotlin . Tiene métodos de extensión y también se ejecuta en la JVM.


Manifold proporciona Java con métodos de extensión de estilo C # y varias otras características. A diferencia de otras herramientas, Manifold no tiene limitaciones y no tiene problemas con genéricos, lambdas, IDE, etc. Manifold proporciona muchas otras características, como tipos personalizados de estilo F #, interfaces estructurales de tipo TypeScript y tipos de expansión de estilo Javascript .

Además, IntelliJ proporciona soporte integral para Manifold a través del plugin Manifold.

Manifold es un proyecto de código abierto disponible en github .