Nie, vanilla Java nie ma dostępnych metod rozszerzenia. Jednak Lombok dodaje wiele przydatnych funkcji - w tym składni metod rozszerzeń - dzięki swoim adnotacjom i generowaniu kodu bajtowego.
Możesz użyć jego adnotacji @ExtensionMethod, aby "przekonwertować" istniejące metody statyczne na metody rozszerzeń. Pierwszy parametr metod statycznych w zasadzie staje się this
. Na przykład, czy jest to prawidłowy Lombok podwyższonym kod Java:
import lombok.experimental.ExtensionMethod;
@ExtensionMethod({java.util.Arrays.class, Extensions.class})
public class ExtensionMethodExample {
public String test() {
int[] intArray = {5, 3, 8, 2};
intArray.sort();
String iAmNull = null;
return iAmNull.or("hELlO, WORlD!".toTitleCase());
}
}
class Extensions {
public static <T> T or(T obj, T ifNull) {
return obj != null ? obj : ifNull;
}
public static String toTitleCase(String in) {
if (in.isEmpty()) return in;
return "" + Character.toTitleCase(in.charAt(0)) +
in.substring(1).toLowerCase();
}
}
Zauważ, że rozszerzenie metod Lombok może być „wywoływane” na zerowych obiektów - tak długo, jak metoda statyczna jest null-safe, NullPointerException
nie zostanie wyrzucony , ponieważ jest to w zasadzie przetłumaczone na statyczne wywołanie metody. Tak - to sprowadza się do składni cukru, ale myślę, że jest to jeszcze bardziej czytelne niż zwykłe wywołania metod statycznych.
Poza tym, możesz użyć innego języka JVM z operacją Java, jeśli jest to w twoim projekcie. Na przykład Kotlin jest dostarczany z extension methods functionality, a także z niektórymi przydatnymi rozszerzeniami już zdefiniowanymi w bibliotece standardowej. Oto Kotlin and Lombok comparison.
Nie w Javie. Jednak nie wszyscy są zadowoleni z tego słowa w Scali. Może to utrudniać czytelność, łatwość konserwacji. Zazwyczaj tworzy się klasę z funkcjami, takimi jak XxxUtils lub Xxx. Dziedziczenie ma tam swoje własne problemy (klasy końcowe, wymuszona przestarzałość starego kodu, centralizm = tylko jeden punkt rozszerzenia). –