במדריך זה, נסתכל על Data Class ב־Kotlin. אם לא קראת את הפוסט על כיתות Kotlin, אנו ממליצים לך לעשות זאת לפני שתמשיך.
Data Class ב־Kotlin
האם אתה מתעייף מלכתוב אלפי שורות של קוד עבור כיתות נתונים POJO ב־Java? כל מתכנת Java בשלב מסוים חייב להתייחס למספר השורות של קוד שהם צריכים לכתוב עבור כיתות שרק צריכות לאחסן מידע מסוים. בואו נראה כיצד נראית כיתת POJO
Book.java
:
public class Book {
private String name;
private String authorName;
private long lastModifiedTimeStamp;
private float rating;
private int downloads;
public Book(String name, String authorName, long lastModified, float rating, int downloads) {
this.name = name;
this.authorName = authorName;
this.lastModifiedTimeStamp = lastModified;
this.rating = rating;
this.downloads = downloads;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthorName() {
return authorName;
}
public void setAuthorName(String authorName) {
this.authorName = authorName;
}
public long getLastModifiedTimeStamp() {
return lastModifiedTimeStamp;
}
public void setLastModifiedTimeStamp(long lastModifiedTimeStamp) {
this.lastModifiedTimeStamp = lastModifiedTimeStamp;
}
public float getRating() {
return rating;
}
public void setRating(float rating) {
this.rating = rating;
}
public int getDownloads() {
return downloads;
}
public void setDownloads(int downloads) {
this.downloads = downloads;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book that = (Book) o;
if (downloads != that.downloads)
return false;
if (name != null ? !name.equals(that.name) :
that.name != null) {
return false;
}
return authorName != null ?
authorName.equals(that.authorName) :
that.authorName == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (authorName != null ?
authorName.hashCode() : 0);
result = 31 * result + downloads;
return result;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + authorName + '\'' +
", lastModifiedTimestamp='" + lastModifiedTimeStamp + '\'' +
", rating='" + rating + '\'' +
", downloads=" + downloads +
'}';
}
}
וואו! זה 96 שורות של קוד רק לאחסון 5 שדות באובייקט. אנו לא עושים כאן הרבה מלבד לקבל ולהגדיר ערכים, את toString()
, equals()
ו־hashCode()
methods. עם הארכיטקטורות הנקיות ופרקטיקות הפרדת הקוד בתרגולים שלנו, אנו צריכים ליצור כיתות POJO מאחר וכל פרויקט דורש לאחסן מידע במקום מסוים. זה עלול לגרום להגדלת הקוד השלילי. זהו המקום שבו Kotlin מגיעה להציל, עם שימוש ב־Data Classes. Data Classes היא התשובה של Kotlin להפחתת הקוד השלילי. הכיתה POJO שנתונה לעיל יכולה להיות כתובה ב־Kotlin בדרך הבאה:
data class Book(var name: String, var authorName: String, var lastModified: Long, var rating: Float, var downloads: Int)
זהו. Kotlin ממירה קוד java בת 96 שורות לשורת קוד אחת. זהו הדרך של Kotlin להפחתת הקוד השלילי בפרויקט שלך!
יצירת כיתת נתונים ב־Kotlin
הנה הדרישות ליצירת כיתת נתונים ב־Kotlin.
- עליך להוסיף לכיתה את המילה המפתחית
data
- הבנאי הראשי צריך לכלול לפחות פרמטר אחד.
- כל פרמטר בבנאי הראשי חייב לקבל
val
אוvar
. זה אינו המקרה בכיתה רגילה, בה אין חובה לצייןval
אוvar
. - כיתות נתונים אינן יכולות לכלול את המילים המפתחיות
abstract
,open
,sealed
אוinner
.
שיטות מובנות ב־Kotlin Data Class
כיתת הנתונים ב־Kotlin יוצרת אוטומטית את הפונקציות הבאות עבורך.
equals()
ו־hashCode()
toString()
בפורמט של"ספר(name=JournalDev, authorName=Anupam)"
- פונקציות
componentN()
עבור כל אחד מהפרמטרים בסדר המסופק. זה נקרא גם הצהרות הרסות. copy()
תכונות של קטלון דאטה קלאס
הנה כמה מהתכונות שקטלון דאטה קלאס מספק.
-
כדי ליצור בנאי ללא פרמטרים, יש לציין ערכי ברירת מחדל לכל אחד מהפרמטרים הנמצאים בבנאי הראשי.
-
דאטה קלאס מאפשר ירושה (אין צורך לציין את המילה השמורה
open
). -
ניתן לספק באופן חד משמעי יישומות עבור הפונקציות
equals()
,hashCode()
ו־toString()
-
לא מאופשרות יישומות ברורות עבור הפונקציות
copy()
ו־componentN()
. -
ניתן לשלוט בראיונות של ה־getters וה־setters על ידי ציון מודיפיקטורי ראיונות הראשיים כפי שמוצג למטה.
data class Book(var name: String,private var authorName: String, var lastModified: Long, var rating: Float, var downloads: Int)
-
פרמטר של val לא יכיל Setter הוגדר באופן משמעי (ולא ייתן להגדיר אותו באופן ישיר גם!).
ארגומנטים ברירת מחדל ושמות ב-Data Class
הנה מחלקת הנתונים שלנו:
data class Book(var name: String, var authorName: String, var lastModified: Long, var rating: Float, var downloads: Int)
לא נקבעו ערכי ברירת מחדל לאף פרמטר. לכן עלינו להגדיר ארגומנט לכל אחד מהם בהצטיינות כפי שמוצג למטה.
fun main(args: Array<String>) {
val book = Book("Android Tutorials","Anupam", 1234567, 4.5f, 1000)
}
בואו נגדיר כמה ארגומנטים ברירת מחדל ונראה כיצד ההצטיינות משתנה.
data class Book(var name: String, var authorName: String = "Anupam", var lastModified: Long = 1234567, var rating: Float = 5f, var downloads: Int = 1000)
fun main(args: Array<String>) {
var book = Book("Android tutorials","Anupam", 1234567, 4.5f, 1000)
book = Book("Kotlin")
book = Book("Swift",downloads = 500)
book = Book("Java","Pankaj",rating = 5f, downloads = 1000)
book = Book("Python","Shubham",rating = 5f)
}
במקום להגדיר כל ארגומנט, אנו יכולים להגדיר רק את אלה שאינם ברירת מחדל ואת אלה שאנו רוצים באמצעות ארגומנטים בשמות. באמצעות ארגומנטים בשמות, אנו יכולים להגדיר את הארגומנט החמישי כאחד השני על ידי ציון ישיר של שם הפרמטר ואחריו =
. החיים כל כך קלים בדרך הזו!
שיטת toString() של Data Class ב-Kotlin
ה-toString() נוצר באופן משמעי ומדפיס את שמות הארגומנטים והתוויותיהם עבור המופע כפי שמוצג למטה.
data class Book(var name: String, var authorName: String = "Anupam", var lastModified: Long = 1234567, var rating: Float = 5f, var downloads: Int = 1000)
fun main(args: Array) {
var book = Book("Android tutorials","Anupam", 1234567, 4.5f, 1000)
println(book)
book = Book("Kotlin")
println(book)
book = Book("Swift",downloads = 500)
println(book)
book = Book("Java","Pankaj",rating = 5f, downloads = 1000)
println(book.toString())
book = Book("Python","Shubham",rating = 5f)
println(book.toString())
}
//הבא הוא הודפס בקונסול.
//ספר(name=מדריכי Android, שם סופר=אנופם, שונה לאחרונה=1234567, דירוג=4.5, הורדות=1000)
//ספר(name=Kotlin, שם סופר=אנופם, שונה לאחרונה=1234567, דירוג=5.0, הורדות=1000)
//ספר(name=Swift, שם סופר=אנופם, שונה לאחרונה=1234567, דירוג=5.0, הורדות=500)
//ספר(name=Java, שם סופר=פנקג', שונה לאחרונה=1234567, דירוג=5.0, הורדות=1000)
//ספר(name=Python, שם סופר=שובהם, שונה לאחרונה=1234567, דירוג=5.0, הורדות=1000)
הערה: print
הפונקציה מוסיפה אוטומטית toString().
Kotlin Data Class copy() Method
הפונקציה copy משמשת ליצירת עותק של מופע של מחלקת המידע עם כמה מהמאפיינים משתנים. מומלץ להשתמש בפרמטרים val בבנאי של מחלקת המידע כדי להשתמש במאפיינים ללא שינוי במהלך הפעולה. אובייקטים ללא שינוי הם יותר נוחים בעת העברה עם יישומי תהליכות מרובות. לכן, כדי ליצור עותק של אובייקט ללא שינוי בכמה מהמאפיינים, הפונקציה copy()
תהיה מועילה.
data class Book(val name: String, val authorName: String = "Anupam", val lastModified: Long = 1234567, val rating: Float = 5f, val downloads: Int = 1000)
fun main(args: Array) {
val book = Book("Android tutorials","Anupam", 1234567, 4.5f, 1000)
println(book)
val newBook = book.copy(name = "Kotlin")
println(newBook)
}
//הבא הוא הודפס בקונסול.
//ספר(name=מדריכי Android, שם סופר=אנופם, שונה לאחרונה=1234567, דירוג=4.5, הורדות=1000)
//ספר(name=Kotlin, שם סופר=אנופם, שונה לאחרונה=1234567, דירוג=4.5, הורדות=1000)
מחלקת נתונים Kotlin equals() ו- hashCode()
המתודה hashCode()
מחזירה קוד גיבוב עבור האובייקט. אם שני אובייקטים שווים, hashCode()
יחזיר תוצאת שלמה זהה. לכן, equals()
תחזיר true אם ה-hashCode()
זהה, אחרת תחזיר false.
data class Book(val name: String, val authorName: String = "Anupam", val lastModified: Long = 1234567, val rating: Float = 5f, val downloads: Int = 1000)
fun main(args: Array) {
val book = Book("Android tutorials","Anupam", 1234567, 4.5f, 1000)
println("Hashcode is ${book.hashCode()}")
val newBook = book.copy(name = "Kotlin")
println("Hashcode is ${newBook.hashCode()}")
val copyBook = book.copy()
println("Hashcode is ${copyBook.hashCode()}")
if(copyBook.equals(book))
println("copyBook and book are equal")
if(!book.equals(newBook))
println("newBook and book are NOT equal")
}
//המשך מודפס בקונסולה.
//הקוד גיבוב הוא 649213087
//הקוד גיבוב הוא 1237165820
//הקוד גיבוב הוא 649213087
//copyBook ו-book שווים
//newBook ו-book אינם שווים
קודי הגיבוב של האובייקט הראשון והשלישי שווים לכן הם שווים. הערה: המתודה equals()
שקולה ל-==
בקוטלין.
הצהרות הרסורות
הפונקציה componentN()
מאפשרת לנו לגשת לכל אחד מהארגומנטים שצוינו בבנאי, בסדר שצוין. N הוא מספר הפרמטרים בבנאי.
data class Book(val name: String, val authorName: String = "Anupam", val lastModified: Long = 1234567, val rating: Float = 5f, val downloads: Int = 1000)
fun main(args: Array<String>) {
val book = Book("Android tutorials","Anupam", 1234567, 4.5f, 1000)
println(book.component1()) //Android tutorials
println(book.component2()) //Anupam
println(book.component3()) //1234567
println(book.component4()) //4.5
println(book.component5()) //1000
}
ההצהרות הרסוריות מאפשרות לנו לגשת לארגומנטים כמאפיינים מהאובייקט של המחלקה כפי שמוצג למטה.
data class Book(val name: String, val authorName: String = "Anupam", val lastModified: Long = 1234567, val rating: Float = 5f, val downloads: Int = 1000)
fun main(args: Array<String>) {
val book = Book("Android tutorials","Anupam", 1234567, 4.5f, 1000)
val (n,a,date,rating,downloads) = book
}
הערה: אם מוגדרת מודיפיקציה של נראות כגון פרטי על אחד מהארגומנטים, אין אפשרות לגשת אליו בפונקציה הנ"ל.
data class Book(val name: String,private val authorName: String = "Anupam", val lastModified: Long = 1234567, val rating: Float = 5f, val downloads: Int = 1000)
fun main(args: Array<String>) {
val book = Book("Android tutorials","Anupam", 1234567, 4.5f, 1000)
val (n,a,date,rating,downloads) = book //This won't compile since authorName is private
}
זהו הכול לסיכום מהיר על קלאסים למידת נתונים ב-Kotlin. הפניות: מסמכי Kotlin
Source:
https://www.digitalocean.com/community/tutorials/kotlin-data-class