Sau khi làm qua PHP và Python, giờ cũng phải quay về Java. Mặc dù trước đó em không thể nào thẩm được. Nhưng qua cách giảng giải của anh, chi tiết và rõ ràng. Em đã nắm được khái quát về java. Mong a luôn có sức khỏe và nhiệt huyết để làm các video tiếp theo. Về VueJS hoặc các công nghệ hay ho khác. Cảm ơn anh.
4:20 em thấy mấy trang web hay viết DTO kiểu này. - Từ java 14 ra đời immutable class: Record . Đặc điểm của Record là không thể kế thừa, các thuộc tính là final, chỉ có getters, có constructor có đầy đủ tham số và toString. Nếu muốn constructor chỉ định thì phải tự định nghĩa. Theo như vài bài viết em đọc thì nó là Good Practice cho DTO - Nếu dùng Lombok thì dùng các Anotation: @Getter, @AllArgsConstructor, @ToString là đủ chưa ạ => Vậy theo a khi định nghĩa DTO nhận request từ client , thì anh hay dùng cái nào. Và anh có đánh giá về Record như thế nào ạ.
Để xuất của anh là e dùng cái nào thì thêm cái đó nhé! Với record a có áp dụng cho 1 dự án rồi nên a thấy có thể dùng ở một số case như khởi tạo bean service, repository hay 1 số bean đc định nghĩa từ component. Còn dto dùng record định nghĩa thì nhọc lém dùng lombok cho đỡ vất và e ạ. Suy cho cùng lập trình là biến những thứ phúc tạp trở nên đơn giản hơn mà chứ ko phải là biến cho mọi thứ trở nên phức tạp và ko hiểu hơn e nhé
Best practice của mình khi tạo dto + lombok sẽ là @Value @NoArgConstructor(force = true, access = AccessLevel.PRIVATE) @AllArgConstructor Khi làm với cách này thì sẽ không bị conflict với tụi jackson
Khi e muốn tạo 1 bản copy từ bản chính Widget testWidget = Widget.builder() .name("foo") .id(1) .build(); Widget.WidgetBuilder widgetBuilder = testWidget.toBuilder(); Widget newWidget = widgetBuilder.id(2).build();
Vậy @noarg để làm gì, tôi không nghĩ nó vô nghĩa, ví dụ của bạn đó là khi ko có cả 2 annotations allarg và noarg, bạn thử thêm chỉ allarg xem sao, rất có thể sẽ ko có constructor noarg trong file .class
nếu bạn không cung cấp bất kỳ một constructor nào thì java sẽ tự động thêm một constructor không tham số cho class, còn nếu bạn cung cấp một constructor bất kỳ thì constructor mặc định không tham số sẽ không được tự động thêm nữa, khi đó nếu tạo mới một object bằng từ khóa new với constructor không tham số sẽ báo lỗi compile, do vậy @NoArgsConstructor dành cho trường hợp này
@@tayjava cái tỉ mỉ từng tý một thì em okie. Nhưng em đang muốn hỏi để tradeoff, ví dụ nếu a phải đánh giá à cái này thời điểm này nó cần setter thôi thì thêm sett, thời điểm tiếp thấy cần getter a thêm getter, sau a thấy toátrinf a thêm tostrinf, sau nhận ra rằng thêm @data cho nhanh. Nếu việc đó nó k quá ảnh hưởng và chấp nhận dk thì nên chọn những annotation cover dk 80% cái mình cần dùng, để dành thời gian phát triển sản phẩm được nhanh hơn.
Constructor mặc định(Không có parameter truyền vào) chỉ tự động khởi tạo trong trường hợp lớp đó không có bất kỳ constructor nào khác, nhưng nếu mình dùng @AllArgsConstructor thì nó sẽ tạo ra một constructor được truyền vào với tất cả các parameter của lớp, nên nếu không dùng @NoArgsConstructor thì không thể tự khởi tạo một constructor không có parameter truyền vào. Cài này không riêng java mà cả c++ cũng thế. Mong anh sửa lại chứ sai kiến thức thế này thì chết.
Ấy zà! Vậy trước kia lombok chưa ra đời e nghĩ tụi già như bọn code như thế nào nó chạy đây?? Lombok chỉ là plugin cắm vào để bớt các thao tác thủ công thôi ơi chứ nó đâu phải core java chứ ! E có thể nghiên cứu thêm về jvm để hiểu chỗ này sâu hơn nha
em thắc mắc chỗ @NoArgsConstructor nếu không có nó sẽ vẫn tạo constructor NoArgs mặc định, nhưng khi dùng ObjectMapper để map từ string sang Object, nó báo lỗi thiếu constructor NoArgs , khi thêm @NoArgsConstructor hoặc constructor vào thì hết lỗi và hoạt động bình thường anh giải đáp lý do giúp em
@@tayjava vâng a, mà qua video em cũng thấy một điểm khác nữa là khi anh dùng @Builder mà nó không yêu cầu constructor có tham số, còn e dùng mình builder nó sẽ báo là cần nhỉ
Bản chất của constructor mặc định là chỉ xuất hiện khi không có constructor nào được tạo bất kỳ, nếu tồn tại constructor nào đó thì mặc định vô hiệu, trong video do ko có bất cứ constructor nào nên nó không bị lỗi, nhưng thử thêm @AllArgsConstructor và không có @NoArgsConstructor thì khi gọi constructor no args thì sẽ lỗi biên dịch ngay.
Sau khi làm qua PHP và Python, giờ cũng phải quay về Java. Mặc dù trước đó em không thể nào thẩm được. Nhưng qua cách giảng giải của anh, chi tiết và rõ ràng. Em đã nắm được khái quát về java. Mong a luôn có sức khỏe và nhiệt huyết để làm các video tiếp theo. Về VueJS hoặc các công nghệ hay ho khác. Cảm ơn anh.
Cảm ơn e nha!
quá tuyệt vời. Cám ơn anh
hay qua, tks ban nhe
Hay quá a, học cuốn thực sự❤❤❤
E like và share đi chứ :))
4:20 em thấy mấy trang web hay viết DTO kiểu này.
- Từ java 14 ra đời immutable class: Record . Đặc điểm của Record là không thể kế thừa, các thuộc tính là final, chỉ có getters, có constructor có đầy đủ tham số và toString. Nếu muốn constructor chỉ định thì phải tự định nghĩa. Theo như vài bài viết em đọc thì nó là Good Practice cho DTO
- Nếu dùng Lombok thì dùng các Anotation: @Getter, @AllArgsConstructor, @ToString là đủ chưa ạ
=> Vậy theo a khi định nghĩa DTO nhận request từ client , thì anh hay dùng cái nào. Và anh có đánh giá về Record như thế nào ạ.
Để xuất của anh là e dùng cái nào thì thêm cái đó nhé! Với record a có áp dụng cho 1 dự án rồi nên a thấy có thể dùng ở một số case như khởi tạo bean service, repository hay 1 số bean đc định nghĩa từ component. Còn dto dùng record định nghĩa thì nhọc lém dùng lombok cho đỡ vất và e ạ. Suy cho cùng lập trình là biến những thứ phúc tạp trở nên đơn giản hơn mà chứ ko phải là biến cho mọi thứ trở nên phức tạp và ko hiểu hơn e nhé
nếu class có constructor có tham số thì vẫn cần phải có constructor k tham số chứ a?
Best practice của mình khi tạo dto + lombok sẽ là
@Value
@NoArgConstructor(force = true, access = AccessLevel.PRIVATE)
@AllArgConstructor
Khi làm với cách này thì sẽ không bị conflict với tụi jackson
Hay quas a
Hay quá a ơi
sao em k thấy mấy bài 1,2,3,4 về service entity ạ
E vào playlist học theo danh sách phát nhé, mấy bài jpa từ bài 14 cơ
@@tayjava e cảm ơn ạ
cho e hỏi khi nào dùng toBuilder đc vậy ạ?
Khi e muốn tạo 1 bản copy từ bản chính
Widget testWidget = Widget.builder()
.name("foo")
.id(1)
.build();
Widget.WidgetBuilder widgetBuilder = testWidget.toBuilder();
Widget newWidget = widgetBuilder.id(2).build();
Vậy @noarg để làm gì, tôi không nghĩ nó vô nghĩa, ví dụ của bạn đó là khi ko có cả 2 annotations allarg và noarg, bạn thử thêm chỉ allarg xem sao, rất có thể sẽ ko có constructor noarg trong file .class
Nó không vô nghĩa bạn ơi ! Nhưng nó chỉ cần thiết khi chúng ta định nghĩa entity thôi còn dto thì ko cần nha
nếu bạn không cung cấp bất kỳ một constructor nào thì java sẽ tự động thêm một constructor không tham số cho class, còn nếu bạn cung cấp một constructor bất kỳ thì constructor mặc định không tham số sẽ không được tự động thêm nữa, khi đó nếu tạo mới một object bằng từ khóa new với constructor không tham số sẽ báo lỗi compile, do vậy @NoArgsConstructor dành cho trường hợp này
dùng record để tạo DTO dc ko a
Đc thì có đc nhưng nhọc thôi e, dùng lombok thì tự động hoá còn record thì mình phải làm thủ công
Cho em hỏi ngu phát, nếu e sử dụng @Data, mặc dù e biết nó thừa thì sẽ sẽ gây ảnh hưởng gì tới project của chúng ta ạ?
Nó ko gây lỗi nhưng nhiều code thừa -> cái này gọi là code ko sạch e ạ. E muốn ứng dụng của mình có chất lượng cao thì cần tỷ mỷ từng tý e nhé
@@tayjava cái tỉ mỉ từng tý một thì em okie. Nhưng em đang muốn hỏi để tradeoff, ví dụ nếu a phải đánh giá à cái này thời điểm này nó cần setter thôi thì thêm sett, thời điểm tiếp thấy cần getter a thêm getter, sau a thấy toátrinf a thêm tostrinf, sau nhận ra rằng thêm @data cho nhanh. Nếu việc đó nó k quá ảnh hưởng và chấp nhận dk thì nên chọn những annotation cover dk 80% cái mình cần dùng, để dành thời gian phát triển sản phẩm được nhanh hơn.
@@duyhoangta7988 nếu là như vậy thì e dùng đúng rồi đó!
Constructor mặc định(Không có parameter truyền vào) chỉ tự động khởi tạo trong trường hợp lớp đó không có bất kỳ constructor nào khác, nhưng nếu mình dùng @AllArgsConstructor thì nó sẽ tạo ra một constructor được truyền vào với tất cả các parameter của lớp, nên nếu không dùng @NoArgsConstructor thì không thể tự khởi tạo một constructor không có parameter truyền vào. Cài này không riêng java mà cả c++ cũng thế. Mong anh sửa lại chứ sai kiến thức thế này thì chết.
Ấy zà! Vậy trước kia lombok chưa ra đời e nghĩ tụi già như bọn code như thế nào nó chạy đây?? Lombok chỉ là plugin cắm vào để bớt các thao tác thủ công thôi ơi chứ nó đâu phải core java chứ ! E có thể nghiên cứu thêm về jvm để hiểu chỗ này sâu hơn nha
@@tayjava ở phiên bản spring, lombok mới thì em làm theo các của anh sẽ báo lỗi ạ
10đ
em thắc mắc chỗ @NoArgsConstructor
nếu không có nó sẽ vẫn tạo constructor NoArgs mặc định,
nhưng khi dùng ObjectMapper để map từ string sang Object, nó báo lỗi thiếu constructor NoArgs , khi thêm @NoArgsConstructor hoặc constructor vào thì hết lỗi và hoạt động bình thường
anh giải đáp lý do giúp em
Cái này do nó bị xung đột giữa 2 thư viện e nhé! E fix đc lỗi là okie rồi nha không cần quá cố chấp e ạ, e hiểu ý nghĩa và cách dùng của nó là tốt rồi
@@tayjava vâng a, mà qua video em cũng thấy một điểm khác nữa là khi anh dùng @Builder mà nó không yêu cầu constructor có tham số, còn e dùng mình builder nó sẽ báo là cần nhỉ
E xem lại source code a để ở phần mô tả video ấy xem khác nhau gì ko? Xem lại version lombok có giống cái a đang dùng ko nhé
Bản chất của constructor mặc định là chỉ xuất hiện khi không có constructor nào được tạo bất kỳ, nếu tồn tại constructor nào đó thì mặc định vô hiệu, trong video do ko có bất cứ constructor nào nên nó không bị lỗi, nhưng thử thêm @AllArgsConstructor và không có @NoArgsConstructor thì khi gọi constructor no args thì sẽ lỗi biên dịch ngay.