حاشیه نویسی ها قسمت 1 - کمی خسته کننده
در این بخش، تصمیم گرفتم به کتابخانه Lombok بپردازم، زیرا این کتابخانه یک نماینده شناخته شده حاشیه نویسی کد منبع است. در مقاله بعدی به حاشیه نویسی زمان اجرا خواهم پرداخت.
روزی روزگاری یک برنامه نویس جاوا بود. او هر روز کدهای معمولی را می نوشت، به عنوان مثال، مانند این:
در این مرحله، امیدوارم شما خواننده من علاقه مند شده باشید، زیرا آنچه در ادامه می آید مقدمه ای کوتاه با پیوندهایی به جزئیات خواهد بود. Lombok همچنین به شما امکان میدهد تولید کد را سفارشی کنید، به عنوان مثال، همه دریافتکنندهها و تنظیمکنندهها همیشه مورد نیاز نیستند، یا ممکن است برای تولید کد هش به الگوریتم دیگری نیاز داشته باشید. برای انجام این کار، حاشیهنویسیهای جداگانهای وجود دارد (من فکر میکنم بسیاری از آنها نیازی به توضیح ندارند): @Getter/@Setter، @ToString، @EqualsAndHashCode، @NoArgsConstructor، @RequiredArgsConstructor، و @AllArgsConstructor، @Log اینها بیشترین هستند. مشترک. کل مجموعه را می توان در اینجا
مشاهده کرد . به var و val توجه ویژه ای داشته باشید. این به این معنی است که می توانید کدهای زیر را بنویسید:

package lombok;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
if (age != person.age) return false;
return name != null ? name.equals(person.name) : person.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
این کلاس معمولی است - فقط 2 فیلد (به هر حال، گاهی اوقات بیش از 10-15 فیلد وجود دارد). البته همه اینها را می توان در IDE تولید کرد. اما لعنتی، این جای خودش را می گیرد. اگر 15-20 فیلد وجود داشته باشد، هر کدام از آنها نیاز به گیرنده، تنظیم کننده، سازنده دارد... در این میان، یکی دو روش دیگر که با چشم قابل مشاهده نیستند، به راحتی از بین می روند. چگونه به این برنامه نویس کمک کنیم سریعتر و کمتر بنویسد؟ لومبوک از ماهیتابه خارج و با شما داخل آتش اینجا همان کلاس است، اما اکنون از Lombok استفاده می کنیم:
package lombok;
@Data
public class Person {
private String name;
private int age;
}
همین. باحال، ها؟ حاشیه نویسی @Data چه کاری انجام می دهد؟ در طول کامپایل، این حاشیه نویسی getters/setters را برای همه فیلدها تولید می کند و طبق قوانین استاندارد، toString()،quals() و hashCode() را لغو می کند. می توانید افزونه را در IDE نصب کنید. هر روشی را که هنوز ایجاد نشده است می بیند. 
package lombok;
import lombok.experimental.var;
@Data
public class Person {
private String name;
private int age;
public static void main(String[] args) {
var person = new Person();
person.setAge(22);
System.out.println(person);
}
}
چرا این لازم است؟ به عنوان مثال، ما یک کلاس RandomAccessFileChannel داریم. چرا می خواهیم اینگونه کد بنویسیم؟
RandomAccessFileChannel channel = new RandomAccessFileChannel();
اگر بتوانیم این کار را انجام دهیم؟
var channel2 = new RandomAccessFileChannel();
به نظر من این همیشه قابل قبول نیست. به عنوان مثال، ما یک متد شیطانی داریم که یک نقشه شیطانی را برمی گرداند:
public static Map<List<Set<Integer>>, Set<List<String>>> evilMap() {
return new HashMap<>();
}
اگه اینجوری صداش کنی:
Map<List<Set<Integer>>, Set<List<String>>> listSetMap = evilMap();
بعد کم و بیش مشخص می شود که با چه چیزی کار می کنیم. اگر تماس به این صورت است:
var listSetMap = evilMap();
آنوقت فقط شیطان میداند چه ()evilMap آنجا برمیگردد و تا زمانی که به خود متد نگاه نکنید، نمیدانید. چرا دور فایل های منبع بدوید؟ به طور کلی، شما باید مراقب این موضوع باشید. شاخه آزمایشی: در اینجا می خواهم به حاشیه نویسی @UtilityClass اشاره کنم . یک سازنده خصوصی ایجاد میکند که یک استثنا ایجاد میکند (بنابراین دستهای کوچولو از انعکاس برای دخالت در آنجا استفاده نمیکنند). و در ابتدای کلاس بسیار زیبا است - به ما می گوید که روش های کاربردی وجود دارد. حاشیه نویسی @Delegate الگوی تفویض اختیار را پیاده سازی می کند. فرض کنید کلاسی دارید که چیزی را به کلاس دیگری تفویض میکند و فقط در برخی از روشها تغییراتی ایجاد میکنید - این حاشیهنویسی شما را از تکرار روشها نجات میدهد و آنها را پیگیری میکند. اگر روشی را حذف یا اضافه کنید، این یادداشت متوجه خواهد شد. شاخه حاشیه نویسی تجربی
وب سایت رسمی
GitHub
برای اینکه IDE به درستی با lombok کار کند و متدهای موجود را برجسته نکند، باید افزونه را نصب کنید. وب سایت رسمی دارای بخش راه اندازی
است که در آن می توانید نحوه اتصال افزونه را برای هر IDE مشاهده کنید. همانطور که می بینید، لومبوک محبوب است:> 5000 ستاره و> 1000 چنگال. بهار در کلاس های خود از لومبوک استفاده می کند. اگر Spring را در پروژه خود دارید، نگاهی بیندازید - ممکن است بدون اطلاع شما لومبوک را وارد کرده باشد.
GO TO FULL VERSION