Mám jednoduchou funkci sinus a její tři možné implementace z nichž jednu překladač při JIT vybere a použije.
Ne, překladač JIT žádnou implementaci nevybere.
Přesně tak to pokud vím Java dělá, akorát nemá ty jednoduché funkce a musí si vypomáhat statickýma metodama.
Ne, JIT žádnou implementaci nevybírá. Kdybyste použil statickou metodu, váš kód na té statické metodě bude záviset a nezměníte to jinak, než změnou zdrojového kódu. Až se za pár let stane běžnou součástí počítačů komponenta, která bude umět sinus počítat tisíckrát rychleji, váš kód bude pořád dál používat starou pomalou metodu počítání na CPU.
Proč bych tady měl chtít cokoliv jiného než tu jednoduchou funkci?
Máte tři různé implementace. Pokud chcete, aby byly vzájemně zastupitelné, musí mít společné rozhraní. Uživatel té funkce používá rozhraní, nemá vazbu přímo na nějakou implementaci. No a pak samozřejmě musíte mít nějaký kód, který dosadí tu konkrétní implementaci.
Třeba budete mít takovýhle kód. Všimněte si, že
Calculator neví nic o nějaké konkrétní implementaci. Kdybyste použil statickou metodu, bude
Calculator na tuto metodu pevně navázán a bez změny zdrojového kódu tu implementaci nezměníte.
interface TrigonometricFunctions {
public double sin(double angle);
}
class Calculator {
private final TrigonometricFunctions trigonometricFunctions;
public Calculator(TrigonometricFunctions trigonometricFunctions) {
assert trigonometricFunctions != null;
this.trigonometricFunctions = trigonometricFunctions;
}
public void compute() {
…
double sinResult = trigonometricFunctions.sin(0.0d);
…
}
}