- vừa được xem lúc

Intellij generate code with getters template.

0 0 14

Người đăng: logbasex

Theo Viblo Asia

1. Introduction

Giả sử bạn có class MyClass với một collection field là myStrings và accessor của nó trông như thế này:

@Data
public class MyClass { private List<String> myStrings; public List<String> getMyStrings() { return myStrings; }
}

Đây là một class (Java Bean) với thiết kế rất cơ bản nhưng bởi vì myStrings là một collection nên việc encapsulate collection thông qua phương thức getter MyClass#getMyStrings() như trên là chưa đủ tốt. Còn tại sao thì các bạn có thể tham khảo bài viết này để biết thêm thông tin.

Dù có nhiều cách encapsulate một collection field tùy vào bài toán cần giải quyết, nhưng về cơ bản thì chúng ta thường encapsulate theo thiên hướng dùng để tránh NPE (Null Pointer Exception) khi dùng dot (.) chaining operator là chính. Đơn cử như sau:

A.getMyStrings().B().C(); public List<String> getMyStrings() { if (this.myStrings == null) return Collections.emptyList(); return myStrings;
}

Có thể bạn sẽ nghĩ rằng có cần làm phức tạp bài toán lên không, khi chỉ cần làm đơn giản như thế này là xong:

private List<String> myStrings = new ArrayList<>(); public List<String> getMyStrings() { return myStrings;
}

😂😂 Đồng ý là đơn giản nhưng chưa đúng tinh thần OOP và chưa đủ tốt. Mời bạn tham khảo bài viết mình đã dẫn link ở phía trên nha.

2. Problem

Câu chuyện bây giờ là mỗi lần tạo getter cho collection field thì Intellij mặc định sẽ chỉ có một câu lệnh duy nhất là return field, và câu hỏi đặt ra bây giờ là có cách nào để generate code tự động không nhỉ? Câu trả lời là có. Thật may mắn là với sức mạnh của IDEA Utimate, chúng ta sẽ giải quyết bài toán này như sau:

Select Getter:

Click on ellipsis icon (three dot):

Make a copy:

Sau đó sử dụng đoạn custom code getter template sau:

#if($field.modifierStatic)
static ##
#end
$field.type ##
#if($field.recordComponent) ${field.name}##
#else
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.boolean && $field.primitive) is##
#else get##
#end
${name}##
#end
() { if (this.$field.name == null) return Collections.emptyList(); return $field.name;
}

Demo:

All done. Tuy nhiên bạn sẽ thấy có điều gì đó chưa được hoàn thiện ở đây là nếu sử dụng customer getter như trên cho các field kiểu String, Integer cũng sẽ được add thêm đoạn code if logic vào, làm như thế là không đúng. Chúng ta chỉ thêm đoạn code logic đó vào khi và chỉ khi một field có type là collection hay cụ thể hơn là ArrayList .

Hiện tại thì trên documentation của IDEA về customize template không có hướng dẫn gì về ngôn ngữ viết và cách viết template cả, nên khả năng cao là chúng ta phải tạo ra nhiều template khác nhau chứ khó có thể tạo ra một template one-size-fits-all được.

Mặc dù thế nhưng không phải không có hy vọng, các bạn có thể tìm thêm manh mối ở idea-community repository hoặc theo dõi câu hỏi Intellij custom getter template: How to encapsulate collection field trên Stackoverflow.

3. Optional getter

#if($field.modifierStatic)
static ##
#end
Optional<$field.type> ##
#if($field.recordComponent) ${field.name}##
#else
#set($name = $StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project))))
#if ($field.boolean && $field.primitive) is##
#else get##
#end
${name}##
#end
() { return Optional.ofNullable($field.name);
}

4. References

 ____________________
< Thanks for reading > -------------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || |

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tổng hợp các bài hướng dẫn về Design Pattern - 23 mẫu cơ bản của GoF

Link bài viết gốc: https://gpcoder.com/4164-gioi-thieu-design-patterns/. Design Patterns là gì. Design Patterns không phải là ngôn ngữ cụ thể nào cả.

0 0 270

- vừa được xem lúc

Học Spring Boot bắt đầu từ đâu?

1. Giới thiệu Spring Boot. 1.1.

0 0 255

- vừa được xem lúc

Cần chuẩn bị gì để bắt đầu học Java

Cần chuẩn bị những gì để bắt đầu lập trình Java. 1.1. Cài JDK hay JRE.

0 0 35

- vừa được xem lúc

Sử dụng ModelMapper trong Spring Boot

Bài hôm nay sẽ là cách sử dụng thư viện ModelMapper để mapping qua lại giữa các object trong Spring nhé. Trang chủ của ModelMapper đây http://modelmapper.org/, đọc rất dễ hiểu dành cho các bạn muốn tìm hiểu sâu hơn. 1.

0 0 179

- vừa được xem lúc

[Java] 1 vài tip nhỏ khi sử dụng String hoặc Collection part 1

. Hello các bạn, hôm nay mình sẽ chia sẻ về mẹo check String null hay full space một cách tiện lợi. Mình sẽ sử dụng thư viện Lớp StringUtils download file jar để import vào thư viện tại (link).

0 0 55

- vừa được xem lúc

Deep Learning với Java - Tại sao không?

Muốn tìm hiểu về Machine Learning / Deep Learning nhưng với background là Java thì sẽ như thế nào và bắt đầu từ đâu? Để tìm được câu trả lời, hãy đọc bài viết này - có thể kỹ năng Java vốn có sẽ giúp bạn có những chuyến phiêu lưu thú vị. DJL là tên viết tắt của Deep Java Library - một thư viện mã ng

0 0 122