Staatiline tehasemeetod
Sissejuhatus
Javas kasutatakse objektide loomiseks konstruktorit, kuid sellel on kindlad piirangud. Konstruktoritel on alati sama nimi kui klassil, nad peavad iga kord tagastama uue objekti ning nende nime kaudu ei ole võimalik väljendada kavatsust.
Staatiline tehasemeetod on staatiline meetod, mille eesmärk on luua ja tagastada objekt.
See on konstruktorile ja new märksõnale alternatiiv ning võimaldab koodi paindlikumaks muuta.
Näiteid staatilistest tehasemeetoditest Javas:
List<String> names = List.of("Alice", "Bob", "Charlie");
Optional<String> value = Optional.of("hello");
int number = Integer.valueOf(42);
Ühegi puhul ei kasutata new märksõna, et objekti luua.
Need on meetodid, mis loovad ja tagastavad objekti ise.
Konstruktorite piirangud
Konstruktorite peamine piirang on see, et nad on seotud klassi nimega ning seda muuta ei saa.
Oletame, et meil on klass nimega Temperature, mida saab luua kas Celsiuse või Fahrenheiti kraadidest.
Konstruktorite puhul näeksid mõlemad ülelaetud (overloaded) versioonid välja identsed, kui parameetrite tüübid on samad:
class Temperature {
private double celsius;
public Temperature(double celsius) {
this.celsius = celsius;
}
// Cannot add another constructor with the same parameter type!
// public Temperature(double fahrenheit) { ... } // Compile error: duplicate constructor
}
Java ei luba kahel konstruktoril (meetoditel üldiselt) omada sama arvu parameetreid, ilma tüüpe muutmata, isegi kui väärtused tähendavad erinevaid asju.
Kui kirjutada new Temperature(100);, siis Java ei tea, kas tegu on Celsiuse või Fahrenheitiga.
Staatiline tehasemeetod
Seda probleemi on võimalik lahendada staatilise tehasemeetodi kaudu. Selle asemel, et konstruktorit kasutada, muudame selle privaatseks ning loome kaks kirjeldavate nimedega staatilist meetodit. Näiteks:
class Temperature {
private double celsius;
// Private constructor
private Temperature(double celsius) {
this.celsius = celsius;
}
// Static factory method
public static Temperature fromCelsius(double celsius) {
return new Temperature(celsius);
}
// Static factory method
public static Temperature fromFahrenheit(double fahrenheit) {
return new Temperature((fahrenheit - 32) * 5 / 9);
}
public double toCelsius() {
return celsius;
}
public double toFahrenheit() {
return celsius * 9 / 5 + 32;
}
}
Mõlema meetodi eesmärk on selge ning neid on võimalik välja kutsuda järgnevalt:
Temperature boiling = Temperature.fromCelsius(100);
Temperature bodyTemp = Temperature.fromFahrenheit(98.6);
System.out.println(boiling.toFahrenheit()); // 212.0
System.out.println(bodyTemp.toCelsius()); // 37.0
Ning kuna konstruktor on privaatne, siis ainus viis seda klassi luua ongi ainult läbi nende meetodite.
Nimereeglid
Staatilised tehasemeetodid järgivad Javas levinud nimereegleid. Nendega puutute kokku nii standardteegis kui ka hästi kirjutatud koodis:
| Nimi | Kirjeldus | Näide |
|---|---|---|
of | Koondab mitu parameetrit objektiks | List.of(...), LocalDate.of(...) |
from | Konverteerib teatud väärtuse objektiks | Temperature.fromCelsius(...) |
valueOf | Konverteerib väärtusest, tihti vahemällu salvestades | Integer.valueOf(42) |
getInstance | Tagastab (vahest jagatud) eksemplari | Calendar.getInstance() |
create / newInstance | Loob alati uue eksemplari | Array.newInstance(...) |
get + type | Tagastab objekti kindlas vormis | Optional.empty() |
Kindlat kokkulepitud reeglit pole, nime valimisel tuleb lähtuda meetodi eesmärgist.