Ako by ste napísali extension metódu v Jave?
sobes.tech AI
Odpoveď od AI
V Jave nie je možné napísať skutočnú extension metódu v rovnakom zmysle ako v Kotlin alebo C#. Hlavným dôvodom je absencia priameho syntaktického cukru na pridanie metód k existujúcim triedam pri zachovaní princípu enkapsulácie.
Avšak, podobné správanie je možné dosiahnuť pomocou nasledujúcich vzorov:
-
Statická pomocná metóda: Vytvorí sa statická trieda s verejnými statickými metódami, ktoré prijímajú inštanciu triedy, ktorú chceme "rozšíriť".
// Príklad triedy, ktorú chceme "rozšíriť" public class MyClass { private String name; public MyClass(String name) { this.name = name; } public String getName() { return name; } }// Statická trieda s "extension-metódou" public class MyClassExtensions { // Metóda napodobňujúca extension-metódu public static void printNameUpperCase(MyClass obj) { if (obj != null) { System.out.println(obj.getName().toUpperCase()); } } }Použitie:
// Použitie "extension-metódy" MyClass myObj = new MyClass("test"); MyClassExtensions.printNameUpperCase(myObj); // Volanie statickej metódy -
Vzor dekorátor (obalovanie): Vytvorí sa nová trieda, ktorá obalí existujúcu triedu a pridá nové správanie.
// Dekorátor trieda public class MyClassDecorator { private MyClass original; // Referencia na pôvodný objekt public MyClassDecorator(MyClass original) { this.original = original; } // Metóda napodobňujúca extension-metódu public void printNameUpperCase() { if (original != null) { System.out.println(original.getName().toUpperCase()); } } // Môžete pridať metódy, ktoré jednoducho delegujú volanie na pôvodný objekt public String getName() { return original.getName(); } }Použitie:
// Použitie dekorátora MyClass myObj = new MyClass("another test"); MyClassDecorator decoratedObj = new MyClassDecorator(myObj); decoratedObj.printNameUpperCase(); // Volanie metódy dekorátora -
Dedičstvo: Ak trieda nie je označená ako
final, je možné vytvoriť podtriedu a pridať nové metódy. Nie je to extension-metóda v priamom zmysle, pretože vytvárate nový typ, ale je to jeden zo spôsobov, ako pridať funkcionalitu.// Podtrieda s novou metódou public class ExtendedMyClass extends MyClass { public ExtendedMyClass(String name) { super(name); } // Nová metóda v podtriede public void printNameUpperCase() { System.out.println(getName().toUpperCase()); } }Použitie (funguje len s inštanciami
ExtendedMyClass):// Použitie podtriedy ExtendedMyClass extendedObj = new ExtendedMyClass("inheritance test"); extendedObj.printNameUpperCase(); // Volanie metódy podtriedy
Najčastejším spôsobom na napodobnenie extension-metód v Jave, najmä na pridanie utilitárnych funkcií k existujúcim knižničným triedam, je použitie statických pomocných metód. Toto je najbližšie duchu extension-metód z iných jazykov, hoci si vyžaduje volanie cez názov statickej triedy.