Utiilklassid
Sissejuhatus
Utiilklass (Utility class) on klass, mis sisaldab ainult staatilisi meetodeid ning mis ei ole mõeldud instantsieerimiseks. Selle eesmärk on koondada omavahel seotud abimeetodid ühte kohta. Need meetodid reeglina ei vaja töötamiseks olekut.
Java standardteegist leidub mitmeid utiilklasse, näiteks:
Mathmatemaatiliste operatsioonide jaoks (sqrt(),abs(),max()jne.).Arraysmassividega seotud operatsioonide jaoks (sort(),toString()).Collections- kollektsioonidega seotud operatsioonid (sort(),reverse()).
Utiliidiklassid kuuluvad GRASP’i (General Responsibility Assignment Software Patterns) Pure Fabrication (väljamõeldis) mustri alla, sest need ei esinda domeenikontseptsiooni, vaid on loodud ainult selleks, et kokku koondada seotud abimeetodid ja saavutada kõrge ühtekuuluvus ning madal sidusus. Need on klassid, mille eesmärk on tarkvaradisaini parandamine, mitte tegeliku maailma objektideks modelleerimine.
Mis teeb klassist utiilklassi?
Utiilklassil on kolm omadust:
- Kõik meetodid on staatilised
- Omab
privatekonstruktorit, et takistada klassist objekti loomist - Ei oma sisemist olekut
Utiilklass on põhimõtteliselt nagu tööriistakast: sa ulatud sisse ja kasutad tööriista, kuid sa ei "loo" kunagi tööriistakasti ennast.
Utiilklassi loomine
Lihtne näide
Oletame, et projektis on mitu kohta, kus tuleb sõnesid valideerida. Selle asemel, et loogikat korrata saame selle ühte kohta kirja panna:
public class StringUtils {
// Private constructor - prevents instantiation
private StringUtils() {
}
public static boolean isNullOrEmpty(String text) {
return text == null || text.isEmpty();
}
public static boolean isNullOrBlank(String text) {
return text == null || text.isBlank();
}
public static String capitalise(String text) {
if (isNullOrEmpty(text)) {
return text;
}
return Character.toUpperCase(text.charAt(0)) + text.substring(1);
}
}
Ning kasutada saab järgnevalt:
System.out.println(StringUtils.isNullOrEmpty("")); // true
System.out.println(StringUtils.isNullOrEmpty("hello")); // false
System.out.println(StringUtils.capitalise("java")); // Java
Privaatne konstruktor
Tähtis detail utiilklasside puhul on privaatne konstruktor. Ilma selleta Java koostab klassile vaikimisi avaliku konstruktori ning võimaldab antud klassist objekte luua:
StringUtils utils = new StringUtils(); // meaningless — there is nothing useful in an instance
See küll ei ole otseselt viga, kuid on eksitav. Privaatne konstruktor selgelt annab märku, et antud klassist ei tohiks objekte luua.
private StringUtils() {}
Kui nüüd proovida objekti luua klassist, tekib kompileerimisviga:
StringUtils utils = new StringUtils(); // Error: 'StringUtils()' has private access
Tavaline vs utiilklass
Otsus utiilklassi ja tavalise klassi vahel sõltub sellest, kas meetodid vajavad objekti olekut:
| Küsimus | Jah | Ei |
|---|---|---|
| Kas meetod vajab objekti-spetsiifilisi andmeid? | Kasuta isendi meetodit | Mõtle staatilise meetodi kasutamisele |
| Kas igal objektil peaks olema oma koopia andmetest? | Kasuta isendimuutujaid | Staatiline väli või ära üldse kasuta välju |
| Kas meetod on iseseisev operatsioon (sisend sisse, väljund välja)? | Tõenäoliselt ei ole utiliit | Hea kandidaat utiilklassiks |
Head tavad
- Utiilklassidel peavad olema kindlad kirjeldavad nimed, näiteks
StringUtils,MathHelper,DateFormatter. LihtsaltHelpervõiUtilson liiga pealiskaudne - Alati kirjuta klassi sisse privaatne konstruktor
- Meetodid peaksid keskenduma ainult ühele kindlale asjale ning ei tohiks mõjutada objektide seisu.
- Alati ei ole mõttekas utiilklassi luua. Kui meetodite grupp töötab loomulikult samade andmetega, kuuluvad need andmed ja meetodid tõenäoliselt tavalisse klassi.