Beállítása kivétel a módszer paramétereinek, dev64
Tegyük fel, hogy van egy osztály módszer, bizonyos feltételek mellett, kivételt dob. Tud-e a módszer paramétereinek megadásához egy kivétel, amely ezzel a módszerrel fog dobni? Ez a kérdés, látszólag egyszerű, de ez nem olyan egyszerű, mint amilyennek látszik.
Például, a következő kód, amely bemutatja a telepítési kivételek, azonnal végrehajtja két antipattern kivételkezelés:
Először is, ez a módszer dob Kivételosztály közvetlenül. hogy teljesen megtöri a szokásos hierarchia kivételkezelés. Másodszor, elveszíti a kiváltó oka, ami miatt valójában kivételt dob. Más szóval, ebben az esetben az ok IOException e. de ha a legfelső szinten kivétel lesz feldolgozni és kinyomtatta stektreys a IOException s az stack trace lesz. Ez a második probléma. Két probléma lehet megközelítést alkalmazza az alábbiak szerint:
Ebben az esetben a dobás nem csak kivétel. és az adott típusú kivétel telt, generikus-alkalmazott módszer. Egy második probléma a kiváltó ok eljárással oldjuk meg initCause (Kiváltható osztály). initCause () kiteszi a kiváltó oka a kivétel. initCause () úgy van kialakítva, hogy akkor ki a kiváltó ok csak egyszer. Ez nem nevezhető újra. Ezért úgy tűnik, ez az úgynevezett initCause (). helyett setCause (). Az alábbiakban egy egység teszt használatát mutatja be a kapott módszer:
Ennek eredményeként a nyomtatott stektreys:
exceptions.MyException: Ez az én kivétel
at exceptions.MyBusinessClassTest.test (MyBusinessClassTest.java:11)
.
Okozta: java.io.IOException: IOException oka
at exceptions.MyBusinessClass.doOrThrow (MyBusinessClass.java:9)
. 27 további
Ie Ez azt mutatja, hogy Tracy-stack van kiváltó oka «IOException ok».
Tekintettel a fenti hasznos módosítását kód helyére a Eldobható Kivétel. mert a két alosztálya Eldobható egyetlen, kivétel. Ez kifejezetten használatra a programozók, és a látszólagos használata Eldobható egy kódot szaga.
Más szóval, a T kiterjeszti Kivétel helyett Eldobható:
Mi ez a megközelítés lehet kényelmetlen? Szerint a legjobb gyakorlatok alkalmazásával kivételek (lásd. Pl Dzhosh Bloh «Hatékony Java»), kivéve annak szükségességét, hogy a lehető legnagyobb hasznos információt, amely jelezheti a hiba okát. Például, hasznos, hogy hozzon létre egy üzenetet kirekesztettség ellen, ez az üzenet tartalmazza a potenciálisan változó részeit. Például:
Itt tesszük az üzenet tartalmát belül ValidationException catch blokk. Ebben a kódot, nincs semmi baj, ő teljesen igaza van. Azonban, ha létrehoz egy kivételt, így a fent leírt megközelítéssel, például az alábbiak szerint:
kiderül, hogy mi lesz létrehozni egy kivétel objektum minden alkalommal kódvégrehajtáskor. függetlenül attól, hogy a hiba valóban meg fog történni, vagy sem. A nagyon létrehozása az objektum nem olyan rossz (ez egy nagyon olcsó művelet Java), de a formázás az üzenet lehet potenciálisan drága. Az erősebb nyelvek, mint a Scala, a problémát meg lehet oldani nagyon egyszerűen.
A különbség csak jelenlétében => a paraméterek listáját a második módszer. Ez az E paramétert a második kiviteli alaknál a hívás megnevezés olyan paraméterek, amelyek értéke fogják kiszámítani, amikor az a használatra módszert akkor teljesül a testen belül, a potenciálisan több alkalommal. Az E módszerek alkalmazásával nem különbözik:
A különbség mutatkozik a teljesítmény. Az első esetben ValidationException objektum jön létre minden esetben, a második - csak akkor, ha szükség van rá, vagyis, Ha hiba lép fel.
Sajnos, a Java nem rendelkezik ilyen kényelmes mechanizmust lusta értékelést. De a Java és a Scala - Turing-teljes, úgyhogy Java lehet végrehajtani ugyanaz, mint a Scala 🙂 Ehhez egy nagyon népszerű minta - szolgáltatót. Állapítsa interfész:
és meggyőződhetünk arról, hogy a módszer orThrow vett érv ExceptionProvider. és nem meztelen Kivétel:
Most a tárgyak létrehozását kivétel csak akkor, amikor szükség van rá. A módszer orThrow () is, például, a következők szerint:
Úgy néz ki, nagyon nehézkes, de ez nem probléma, legalább két okból. Először is, a következő verzió a Java (Java 8) A régóta várt lambda hozzá kell adni a nyelvet, ami csökkenti a fenti kódot, hogy ezt:
Nem sokkal hosszabb, mint a Scala. Másodszor, a szolgáltatók elvonható, például a visszaverődések:
Ez a szolgáltató létrehoz egy kivételével az adott osztályban a megadott üzenetet, formáztak a megadott paraméterek:
Egyértelmű, hogy ahhoz, hogy ez működjön, a kizárás az osztály kell lennie kivitelező egyetlen húr érv.
Arra használják, hogy teljesen nyilvánvaló módon:
Most a kód lett elég könnyen olvasható és nem hordozó felesleges műveletek problémák, és ez nagyon rugalmas.
További cikkek a Java, Java témaköre