Các đối tượng có thể thay đổi/bất biến là gì và chúng dùng để làm gì?  - 1

"Chào, Amigo!"

"Chào, Bilaabo!"

"Hôm nay Bilaabo sẽ cho bạn biết về các đối tượng có thể thay đổikhông thể thay đổi .

"Các đối tượng bạn có thể thay đổi sau khi chúng được tạo ra được gọi là có thể thay đổi ."

"Các đối tượng không thể thay đổi sau khi chúng được tạo ra được gọi là bất biến ."

"Điều gì quyết định liệu tôi có thể thay đổi một đối tượng hay không?"

"Tác giả của một lớp mới có thể đặt các đối tượng của lớp đó thành bất biến. Ví dụ: nếu bạn đặt tất cả các setters ở chế độ riêng tư, thì một đối tượng sẽ chỉ có một hàm tạo và các getter; điều đó có nghĩa là nó sẽ không thể thay đổi sau khi nó được tạo ."

“Và ý nghĩa của việc đó là gì?”

"Các đối tượng bất biến có nhiều thuộc tính hữu ích, nhưng tôi sẽ nêu bật hai thuộc tính phổ biến đối với hầu hết các đối tượng bất biến:"

1) Các đối tượng không thể thay đổi dễ thực hiện hơn nhiều so với các đối tượng có thể thay đổi.

2) Các đối tượng bất biến có thể được sử dụng tự do đồng thời trên nhiều luồng.

"Khi một nhà phát triển quyết định viết một lớp bất biến, anh ta thường tạo cả phiên bản có thể thay đổi và không thể thay đổi của lớp."

"Nhưng điểm viết hai lớp thay vì một là gì?"

"Đôi khi nó đáng giá khi một phiên bản không thể thay đổi của một đối tượng sẽ đơn giản/nhanh hơn nhiều so với một phiên bản có thể thay đổi. Vì vậy, họ tạo ra hai phiên bản. Nó giống như ArrayList và LinkedList: cả hai đều là danh sách, nhưng một được tối ưu hóa cho các mục đích cụ thể, và thứ hai cho những người khác."

"Điều đó có ý nghĩa hơn rồi."

"Cũng có những lớp hoàn toàn bất biến, không có phiên bản có thể thay đổi."

"Nhưng nếu tôi cần thay đổi thứ gì đó ở một trong những đối tượng đó thì sao? Bạn thực sự có thể làm gì với một đối tượng không thể thay đổi?"

"Thông thường, các lớp bất biến chứa nhiều phương thức hoạt động giống như chúng thay đổi đối tượng, nhưng những phương thức này chỉ đơn giản là tạo một đối tượng mới và trả về nó, thay vì thay đổi chính đối tượng đó."

"Đây là một số ví dụ:"

mã Java Sự miêu tả
String s = "london";
String s2 = s.toUpperCase();
Kết quả là, s chứa chuỗi «london» và s2 chứa «LONDON»
Integer i = 1;
Integer j = i;
j++;
Đây là những gì thực sự xảy ra:
Số nguyên i = số nguyên mới(1);
Số nguyên j = i;
j = số nguyên mới(i.getInt()+1);

"Lớp String là một lớp bất biến. Tất cả các đối tượng String là bất biến, nhưng điều đó không ngăn cản chúng ta làm việc với chúng. Ví dụ, phương thức toUpperCase() của lớp String chuyển đổi một String thành chữ hoa (tức là thay thế tất cả các chữ cái nhỏ bằng chữ in hoa). Tuy nhiên, phương thức này không tự thay đổi Chuỗi, thay vào đó, nó trả về một Chuỗi mới. Chuỗi mới này giống với chuỗi đầu tiên ngoại trừ tất cả các ký tự đều là chữ hoa (chữ in hoa)."

"Lớp Integer cũng là một lớp bất biến. Tất cả các đối tượng Integer đều không thay đổi. Mỗi khi chúng ta thay đổi một đối tượng Integer, chúng ta thực sự đang tạo một đối tượng mới."

"Thật thú vị! Hoan hô, Bilaabo."

"Hoan hô cho tôi! Hoan hô cho Bilaabo!"