נסה משאבים בקוטלין

1. הקדמה

שפות מנוהלות, כמו אלה הממוקדות ל- JVM, מטפלות באופן אוטומטי במשאב הנפוץ ביותר: זיכרון.

עם זאת, עלינו להתמודד עם כל מיני משאבים, לא רק זיכרון: קבצים, חיבורי רשת, זרמים, חלונות וכו '. בדיוק כמו זיכרון, אלה צריכים להשתחרר כשלא צריך יותר.

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

אם אתה רוצה לדלג על התיאוריה, קפץ ישר לדוגמא.

2. ניהול משאבים אוטומטי

אנו יכולים להבחין בשלושה שלבים שונים בעבודה עם משאבים בג'אווה (פסאודוקוד):

resource = purchaseResource () נסה {useResource (resource)} סוף סוף {releaseResource (resource)} 

אם השפה או הספריה אחראיים על שחרור המשאב ( סוף כל סוף חלק), ואז אנו קוראים לזה ניהול משאבים אוטומטי. תכונה כזו פוטר מאיתנו לזכור לפנות משאב.

כמו כן, מאחר וניהול משאבים בדרך כלל קשור להיקף חסום, אם אנו מתמודדים עם יותר ממשאב אחד בו זמנית, הם תמיד ישוחררו בסדר הנכון.

ב- Java, אובייקטים המחזיקים משאב וכשירים לניהול משאבים אוטומטי מיישמים ממשק ספציפי: סגור עבור משאבי I / O הקשורים ניתן לסגירה אוטומטית.

כמו כן, Java 7 צייד מחדש את הקיים סגור ממשק להארכה ניתן לסגירה אוטומטית.

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

3. ה להשתמש פונקציה בקוטלין

כדי לנהל משאבים באופן אוטומטי, יש שפות בעלות מבנה ייעודי: Java 7 הציגה נסיונות עם משאבים, למשל, בעוד ל- C # יש את באמצעות מילת מפתח.

לפעמים הם מציעים לנו דפוס, כמו RAII ב- C ++. במקרים מסוימים אחרים הם נותנים לנו שיטת ספרייה.

קוטלין נכנס לקטגוריה האחרונה.

לפי העיצוב, זה אין לו מבנה שפה הדומה לו נסה עם משאבים בג'אווה.

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

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

3.1. איך להשתמש בזה

דוגמה פשוטה:

val writer = FileWriter ("test.txt") writer.use {writer.write ("משהו")}

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

השיטה לוקחת ביטוי למבדה, מבצעת אותה ומסלקת את המשאב של (על ידי קריאה סגור() עליו) בכל פעם שהביצוע עוזב את החסימה, בדרך כלל או למעט יוצא מן הכלל.

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

3.2. טופס קצר יותר

בדוגמה לעיל, לשם הבהרה, השתמשנו במשתנה שנקרא סוֹפֵר, וכך נוצר סגירה.

למרות זאת, להשתמש מקבל ביטוי למבדה עם פרמטר יחידהאובייקט המחזיק את המשאב:

FileWriter ("test.txt"). השתמש {w -> w.write ("משהו")}

בתוך הבלוק, אנו יכולים גם להשתמש במשתנה הגלום זה:

FileWriter ("test.txt"). השתמש ב- {it.write ("משהו")}

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

3.3. ההגדרה של להשתמש()

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

כיף מוטבע בציבור T. שימוש (בלוק: (T) -> R): R.

אנחנו יכולים לראות, ב חלק, זה להשתמש מוגדר כפונקציית הרחבה ב- Java סגור מִמְשָׁק.

מידע נוסף על שיטות הרחבה ניתן למצוא במאמר ההיכרות שלנו.

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

3.4. סגור לעומת ניתן לסגירה אוטומטית

אם נשים לב מקרוב לדוגמה מהסעיף הקודם, אנו יכולים לראות כי ה- להשתמש חתימת הפונקציה מוגדרת רק ב- סגור מִמְשָׁק. הסיבה לכך היא שהספרייה הסטנדרטית של קוטלין מכוונת ל- Java 6.

בגרסאות Java לפני 7, ניתן לסגירה אוטומטית לא היה קיים, וכמובן, סגור לא האריך אותו.

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

במקרה כזה, עלינו להוסיף רק תלות בהרחבות של קוטלין עבור Java 7, 8 או כל גרסה שאליה אנו מכוונים:

 org.jetbrains.kotlin kotlin-stdlib-jdk8 

את הגרסה האחרונה של התלות ניתן למצוא ב- Maven Central.

זה נותן לנו עוד להשתמש פונקציית הרחבה המוגדרת על ניתן לסגירה אוטומטית מִמְשָׁק:

כיף מוטבע בציבור T. שימוש (בלוק: (T) -> R): R.

4. מסקנה

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

ניתן למצוא את היישום של כל הדוגמאות וקטעי הקוד בפרויקט GitHub.


$config[zx-auto] not found$config[zx-overlay] not found