I am looking to implement a functionality in a list of object as I would in C# using an extension method.
Something like this:
List<DataObject> list;
// ... List initialization.
list.getData(id);
How do I do that in Java?
Java does not support extension methods.
Instead, you can make a regular static method, or write your own class.
Extension methods are not just static method and not just convenience syntax sugar, in fact they are quite powerful tool. The main thing there is ability to override different methods based on different generic’s parameters instantiation. This is similar to Haskell’s type classes, and in fact, it looks like they are in C# to support C#’s Monads (i.e. LINQ). Even dropping LINQ syntax, I still don’t know any way to implement similar interfaces in Java.
And I don’t think it is possible to implement them in Java, because of Java’s type erasure semantics of generics parameters.
Project Lombok provides an annotation @ExtensionMethod
that can be used to achieve the functionality you are asking for.
Java does not have such feature. Instead you can either create regular subclass of your list implementation or create anonymous inner class:
List<String> list = new ArrayList<String>() {
public String getData() {
return ""; // add your implementation here.
}
};
The problem is to call this method. You can do it "in place":
new ArrayList<String>() {
public String getData() {
return ""; // add your implementation here.
}
}.getData();
Another option is to use ForwardingXXX classes from google-guava library.
Technically C# Extension have no equivalent in Java. But if you do want to implement such functions for a cleaner code and maintainability, you have to use Manifold framework.
package extensions.java.lang.String;
import manifold.ext.api.*;
@Extension
public class MyStringExtension {
public static void print(@This String thiz) {
System.out.println(thiz);
}
@Extension
public static String lineSeparator() {
return System.lineSeparator();
}
}
Manifold provides Java with C#-style extension methods and several other features. Unlike other tools, Manifold has no limitations and does not suffer from issues with generics, lambdas, IDE etc. Manifold provides several other features such as F#-style custom types, TypeScript-style structural interfaces, and Javascript-style expando types.
Additionally, IntelliJ provides comprehensive support for Manifold via the Manifold plugin.
Manifold is an open source project available on github.
It looks like there is some small chance that Defender Methods (i.e. default methods) might make it into Java 8. However, as far as I understand them, they only allow the author of an interface
to retroactively extend it, not arbitrary users.
Defender Methods + Interface Injection would then be able to fully implement C#-style extension methods, but AFAICS, Interface Injection isn't even on the Java 8 road-map yet.
Bit late to the party on this question, but in case anyone finds it useful I just created a subclass:
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);
}
}
}
One could be use the decorator object-oriented design pattern. An example of this pattern being used in Java's standard library would be the DataOutputStream.
Here's some code for augmenting the functionality of a List:
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);
}
}
P.S. I'm a big fan of Kotlin. It has extension methods and also runs on the JVM.
Java
8 now supports default methods, which are similar to C#
's extension methods.
来源:https://stackoverflow.com/questions/4359979/java-equivalent-to-c-sharp-extension-methods