Java - נסה עם משאבים

1. סקירה כללית

תמיכה במשאבים לנסות - שהוצגה בג'אווה 7 - מאפשרת לנו להכריז על משאבים לשימוש ב- לְנַסוֹת לחסום עם הבטחה שהמשאבים ייסגרו לאחר ביצוע אותה חסימה.

על המשאבים המוצהרים ליישם את ניתן לסגירה אוטומטית מִמְשָׁק.

2. שימוש נסה עם משאבים

במילים פשוטות, כדי להיסגר אוטומטית, יש להכריז על משאב וגם לאתחל בתוך ה- לְנַסוֹת, כפי שמוצג מטה:

נסה (כותב PrintWriter = חדש PrintWriter (קובץ חדש ("test.txt"))) {writer.println ("שלום עולם"); } 

3. החלפה לְנַסוֹתלתפוס סוף סוף עם נסה עם משאבים

הדרך הפשוטה והברורה לשימוש בחדש נסה עם משאבים פונקציונליות היא להחליף את המסורתי והמילולי נסה לתפוס סוף סוף לַחסוֹם.

בואו נשווה את דוגמאות הקוד הבאות - ראשית זה אופייני נסה לתפוס סוף סוף ואז לחסום את הגישה החדשה, באמצעות בלוק שווה ערך לנסות עם משאבים:

סורק סורק = null; נסה את {scanner = new scanner (קובץ חדש ("test.txt")); בעוד (scanner.hasNext ()) {System.out.println (scanner.nextLine ()); }} לתפוס (FileNotFoundException e) {e.printStackTrace (); } סוף סוף {if (scanner! = null) {scanner.close (); }}

והנה הפיתרון הסופר תמציתי באמצעות ניסוי משאבים:

נסה (סורק סורק = סורק חדש (קובץ חדש ("test.txt"))) {בזמן (scanner.hasNext ()) {System.out.println (scanner.nextLine ()); }} לתפוס (FileNotFoundException fnfe) {fnfe.printStackTrace (); }

כאן תוכלו להמשיך ולחקור את סוֹרֵק מעמד.

4. נסה עם משאבים עם מספר רב של משאבים

ניתן להכריז על מספר רב של משאבים בסדר גמור ב נסה עם משאבים חסום על ידי הפרדתם עם נקודה-פסיק:

נסה (סורק סורק = סורק חדש (קובץ חדש ("testRead.txt")); סופר PrintWriter = דפוס חדש (קובץ חדש ("testWrite.txt"))) {while (scanner.hasNext ()) {writer.print ( scanner.nextLine ()); }}

5. משאב מותאם אישית עם ניתן לסגירה אוטומטית

לבניית משאב מותאם אישית אשר יטופל כהלכה על ידי a נסה עם משאבים לחסום, המחלקה צריכה ליישם את סגור אוֹ ניתן לסגירה אוטומטית ממשקים, ולדרוס את סגור שיטה:

MyResource בכיתה ציבורית מיישם סגירה אוטומטית {@Override public void close () זורק Exception {System.out.println ("MyResource סגור"); }}

6. צו סגירת משאבים

משאבים שהוגדרו / נרכשו תחילה ייסגרו אחרונים; בואו נסתכל על דוגמה להתנהגות זו:

משאב 1:

מחלקה ציבורית AutoCloseableResourcesFirst מיישמת AutoCloseable {public AutoCloseableResourcesFirst () {System.out.println ("קונסטרוקטור -> AutoCloseableResources_First"); } חלל ציבורי doSomething () {System.out.println ("משהו -> AutoCloseableResources_First"); } @ ביטול ציבורי בטל קרוב () זורק חריג {System.out.println ("סגור אוטומטי לסגור Reses_First"); }} 

משאב 2:

מחלקה ציבורית AutoCloseableResourcesSecond מיישם AutoCloseable {public AutoCloseableResourcesSecond () {System.out.println ("בנאי -> AutoCloseableResources_Second"); } חלל ציבורי doSomething () {System.out.println ("משהו -> AutoCloseableResources_Second"); } @Override חלל ציבורי קרוב () זורק חריג {System.out.println ("סגור אוטומטי לסגור Reses_Second"); }}

קוד:

הזמנה בטלנית פרטיתOfClosingResources () זורק חריג {נסה (AutoCloseableResourcesFirst af = new AutoCloseableResourcesFirst (); AutoCloseableResourcesSecond as = new AutoCloseableResourcesSecond ()) {af.doSomething (); as.doSomething (); }} 

תְפוּקָה:

קונסטרוקטור -> AutoCloseableResources_First

קונסטרוקטור -> AutoCloseableResources_Second

משהו -> AutoCloseableResources_First

משהו -> AutoCloseableResources_Second

סגור אוטומטי לסגירת משאבים_שנייה

סגור אוטומטי לסגירת משאבים_ראשונה

7. לתפוס & סוף כל סוף

א נסה עם משאבים לַחסוֹם עדיין יכול לקבל את לתפוס ו סוף כל סוף חסימות - שיעבוד באותו אופן כמו עם מסורתי לְנַסוֹת לַחסוֹם.

8. ג'אווה 9: סופי למעשהמשתנים

לפני Java 9, נוכל להשתמש רק במשתנים טריים בתוך a נסה עם משאבים לַחסוֹם:

נסה (סורק סורק = סורק חדש (קובץ חדש ("testRead.txt")); סופר PrintWriter = דפוס חדש (קובץ חדש ("testWrite.txt"))) {// הושמט}

כפי שמוצג לעיל, זה היה שפיר במיוחד כאשר הכריזו על מספר משאבים. החל ב- Java 9 וכחלק מ- JEP 213, אנו יכולים להשתמש כעת סופי או אפילו למעשה משתנים סופיים בתוך a נסה עם משאבים לַחסוֹם:

סורק סורק סופי = סורק חדש (קובץ חדש ("testRead.txt")); כותב PrintWriter = PrintWriter חדש (קובץ חדש ("testWrite.txt")) נסה (סורק; סופר) {// הושמט}

במילים פשוטות, משתנה הוא למעשה סופי אם הוא לא משתנה לאחר ההקצאה הראשונה, למרות שהוא לא מסומן במפורש כ סופי.

כפי שמוצג לעיל, סוֹרֵק משתנה מוכרז סופי במפורש, כדי שנוכל להשתמש בו עם ה- נסה עם משאבים לַחסוֹם. למרות ש סוֹפֵר משתנה אינו במפורש סופי, זה לא משתנה לאחר המטלה הראשונה. לכן, מותר לנו להשתמש ב- סוֹפֵר גם משתנה.

9. מסקנה

במאמר זה דנו כיצד להשתמש בניסיון-משאבים, כיצד להחליף לְנַסוֹת, לתפוס, ו סוף כל סוף עם נסי משאבים, בניית משאבים מותאמים אישית עם ניתן לסגירה אוטומטית וסדר סגירת המשאבים.

השלם קוד מקור לדוגמא זמין בפרויקט GitHub זה.