פרויקט Java Lombok

פרויקט Lombok הוא כלי מאוד שימושי עבור פרויקטים ב-Java כדי להפחית קוד מיותר.

הצהרת בעיה

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

package com.askrakesh.java.manage_boilerplate;

import java.time.LocalDate;

public class Person {

	String firstName;
	String lastName;
	LocalDate dateOfBirth;

	public Person(String firstName, String lastName, LocalDate dateOfBirth) {
		super();
		this.firstName = firstName;
		this.lastName = lastName;
		this.dateOfBirth = dateOfBirth;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public LocalDate getDateOfBirth() {
		return dateOfBirth;
	}

	public void setDateOfBirth(LocalDate dateOfBirth) {
		this.dateOfBirth = dateOfBirth;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((dateOfBirth == null) ? 0 : dateOfBirth.hashCode());
		result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
		result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (dateOfBirth == null) {
			if (other.dateOfBirth != null)
				return false;
		} else if (!dateOfBirth.equals(other.dateOfBirth))
			return false;
		if (firstName == null) {
			if (other.firstName != null)
				return false;
		} else if (!firstName.equals(other.firstName))
			return false;
		if (lastName == null) {
			if (other.lastName != null)
				return false;
		} else if (!lastName.equals(other.lastName))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "Person [firstName=" + firstName + ", lastName=" + lastName + "dateOfBirth=" + dateOfBirth + "]";
	}

}

A class should have getter-setters for the instance variables, equals & hashCode method implementation, all field constructors and an implementation of toString method. This class so far has no business logic and even without it is 80+ lines of code. This is insane.

פרויקט Lombok

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

איך עובד פרויקט Lombok ב-Java?

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

פרויקט לומבוק Maven

הוספת לומבוק לפרויקט שלך היא פשוטה. רק הוסף את התלות למטה בקובץ pom.xml של הפרויקט שלך.

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.16.20</version>
</dependency>

הוספת תוסף Lombok ב-IDE (Eclipse)

כאן קבוצת שלבי ההתקנה למערכת Windows:

  1. הורד את ה-JAR מהכתובת https://projectlombok.org/download או השתמש ב-JAR שהורדת מהבניית המיוון שלך.
  2. בצע את הפקודה הבאה בטרמינל: java -jar lombok.jar
  3. הפקודה הזו תפתח חלון כפי שמוצג בתמונה למטה, התקן וצא מהמתקין ואחרי זאת אתחל את ה-Eclipse.

אם אתה ב-MacOS, אז הנה שלבי השימוש ב-Lombok בפרויקט שלך.

  1. העתק את lombok.jar לתיקייה Eclipse.app/Contents/MacOS.
  2. הוסף -javaagent:lombok.jar לסוף קובץ Eclipse.app/Contents/Eclipse/eclipse.ini.
  3. אנא הפעל מחדש את Eclipse והפעל "עיבוד הערות" במאפייני הפרויקט כפי שמוצג בתמונה למטה.

מבט על Lombok במתאר Eclipse

לאחר התקנה בואו נבדוק כיצד אפשר לראות את הקוד שמופחת מבולריות שלנו? ביצעתי את אותה המחלקה מחדש כמו PersonLombok. במתאר Eclipse תצוגה של getter ו-setter עבור firstName. זה נעשה על פי ההוראות @Getter ו-@Setter של Lombok המוגדרות עבור משתנה המופע firstName.

מבט על Lombok בקוד בייט של Java

ניתן לבדוק את הוספת שיטות getter ו-setter לfirstName מהמחלקת בית.

הערות פרויקט Lombok

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

  1. הערת בנאי

    @AllArgsConstructor
    public class PersonLombok {
    	@NonNull String firstName;
    	String lastName;
    	LocalDate dateOfBirth;
    	public static void main(String[] args) {
    		new PersonLombok(null, "Kumar", LocalDate.now());
    	}
    }
    

    הקוד לעיל מכניס את האפשרויות הבאות לתוך המחלקה:

    • בנאי עם כל הארגומנטים על ידי @AllArgsConstructor
    • בדיקת null בעת מעבר ארגומנט בבנאי על ידי @NonNull. הערה @NonNull יכולה גם להיות בשימוש בעת מעבר ארגומנט כפרמטר לשיטה

    כך נראה תוצאת הרץ של התוכנית. @RequiredArgsConstructor יוצר בנאי עם פרמטר 1 עבור כל שדה שדורש טיפול מיוחד. כל השדות הסופיים שאינם מאותחלים מקבלים פרמטר, וכן כל השדות שמסומנים ב @NonNull שאינם מאותחלים בהגדרתם.

  2. אנוטציות Getter/Setter

    אלו אנוטציות ניתן להשתמש בהם ברמת שדה או ברמת מחלקה. אם ברצונך בקרת מערך עדינה אז יש להשתמש ברמת השדה. כאשר משתמשים ברמת מחלקה, כל ה-getter/setters נוצרים. בואו נעבוד על המחלקה שיצרנו למעלה.

    @AllArgsConstructor @Getter @Setter
    public class PersonLombok {
    	String firstName;
    	String lastName;
    	LocalDate dateOfBirth;
    }
    
  3. אנהש, פונקציות hashCode() ו־equals()

    מומלץ לדרוס את הפונקציות hashCode() ו־equals() בעת יצירת מחלקה. ב־Lombok יש לנו את ההזחות @EqualsAndHashCode המכניס קוד לפונקציות equals() ו־hashCode() כשהן הולכות יחד. בנוסף, ההזחה @ToString מספקת מימוש לפונקצית toString(). בואו נראה את זה:

    @AllArgsConstructor @Getter @Setter
    @EqualsAndHashCode 
    @ToString
    public class PersonLombok {
    	String firstName;
    	String lastName;
    	LocalDate dateOfBirth;
    }
    

    עכשיו הצלחנו ליצור מחלקת Person בלי קוד יתר עם עזרת ההזחות של Lombok. אך זה משתפר עוד יותר, נוכל להחליף את כל ההזחות המשמשות במחלקה הנ"ל בעזרת @Data ולקבל את אותו התפקוד.

  4. איפוס דפוס על פי הערות

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

    @Builder
    public class Employee {
    	String firstName;
    	String lastName;
    	LocalDate dateOfBirth;
    
    	public static void main(String[] args) {
    		Employee emp = new EmployeeBuilder().firstName("Rakesh")
    				.lastName("Kumar")
    				.dateOfBirth(LocalDate.now())
    				.build();
    	}
    }
    

    @Delegate יוצר באופן אוטומטי שיטות דלג שמעבירות את הקריאה לשדה זה שעליו נעשה שימוש בהערה זו. "מעדיף הרכב על פני ירושה", אך זה יוצר המון קוד מזווית הבריאה דומה ל-דפוס המתאים. Lombok לקח מכוון זה מההערה באותו שם שב-Groovy במהלך המימוש של הפונקציונליות הזו. בואו נראה יישום:

    @RequiredArgsConstructor
    public class AdapterImpl implements Adapter {
    	@Delegate
    	private final Adaptee instance;
    
    	public static void main(String[] args) {
    		AdapterImpl impl = new AdapterImpl(new Adaptee());
    		impl.display();
    	}
    }
    
    interface Adapter {
    	public void display();
    }
    
    class Adaptee {
    	public void display() {
    		System.out.println("In Adaptee.display()");
    	}
    }
    

    Lombok מספק פונקציונליות לשליטה פינה בכל ההערות.

פלטת קוד: האם ארכיטקטים של Java קשובים?

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

סיכום

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

Source:
https://www.digitalocean.com/community/tutorials/java-project-lombok