từ khóa cuối cùng và các từ khóa Java khác - 1

"Chào, Amigo!"

"Chào, Bilaabo!"

"Hôm nay tôi sẽ nói với bạn về một số từ khóa trong Java. Nhưng tôi sẽ bắt đầu với điều thú vị nhất: từ khóa cuối cùng. "

"Bạn có thể sử dụng từ khóa cuối cùng khi khai báo một biến, phương thức hoặc lớp."

"Và tại sao chúng ta cần cuối cùng?"

"Khá đơn giản. Nếu chúng ta đánh dấu một biến là cuối cùng, thì biến đó sẽ không thể thay đổi được:"

final int i = 5;
i++; //Compilation error: the value of i cannot be changed.

"Tôi hiểu rồi."

"Nếu chúng ta đánh dấu một phương thức là cuối cùng, thì việc ghi đè phương thức đó trong các lớp dẫn xuất bị cấm:"

class Cat
{
 public final String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat
{
 public String getName() //Compilation error: overriding the getName()
 {
  return "tiger";
 }
}

"Tôi hiểu rồi. Nhưng tại sao bạn cần cấm ghi đè một phương thức?"

"Ví dụ, giả sử một lập trình viên đã viết rất nhiều mã quan trọng trong một phương thức và muốn đảm bảo rằng tất cả các lớp kế thừa lớp của anh ta sẽ có hành vi được chỉ định."

"Và cuối cùng, cách sử dụng thứ ba."

"Nếu chúng ta đánh dấu một lớp bằng từ khóa cuối cùng, thì nó không thể được kế thừa."

public final class Cat
{
 public String getName()
 {
  return "cat";
 }
}

class Tiger extends Cat //Compilation error: the Cat class cannot be
{
 public String getName()
 {
  return "tiger";
 }
}

"Và tại sao chúng ta lại ngăn không cho một lớp được kế thừa?"

"Bạn nên hiểu rằng chúng tôi không ngăn cản việc kế thừa gây phiền nhiễu, mà là vì mục đích bảo mật và tính toàn vẹn của mã. Nếu kế thừa lớp không bị cấm, thì hàm ý là nó được cho phép. Và mã được viết bởi lớp trình thiết kế sẽ hoạt động bình thường đối với các đối tượng của lớp này cũng như các đối tượng của bất kỳ lớp dẫn xuất nào."

"Nhưng nếu một nhà phát triển nhận ra rằng ngay cả những thay đổi nhỏ đối với lớp của anh ta cũng sẽ khiến mọi thứ ngừng hoạt động như mong đợi, thì tốt hơn hết là cấm kế thừa."

"Ví dụ, lớp Chuỗi được khai báo là cuối cùng, cũng như tất cả các kiểu nguyên thủy: Số nguyên, Boolean, Double, Ký tự..."

"À, hiểu rồi. Lớp String được tạo ra như một lớp bất biến và nếu chúng đột nhiên có thể thay đổi, thì rất nhiều thứ sẽ ngừng hoạt động."

"Chà, gần như vậy. Hãy nói theo cách này: mọi thứ sẽ hoạt động gần như trước đây, nhưng đôi khi sẽ có những lỗi rất khó tìm và hiểu. Vì vậy, trong một số trường hợp, kế thừa các lớp hoặc phương thức không thực sự là một tội lỗi, nhưng cấm nó có nghĩa là sẽ ít lỗi hơn để bắt sau này."

"Còn nơi nào khác bạn có thể sử dụng cuối cùng?"

"Bạn có thể sử dụng các tham số hàm cuối cùng trước và trước các biến trong một phương thức. Đây là một ví dụ:"

public void setName(final String name)
{
 final String displayName = "Mr."+ name;
  …
 this.name = displayName;
}

"Và quan điểm của điều đó là gì?"

"Chà, có hai. Đầu tiên, chúng tôi khai báo một biến là cuối cùng nếu chúng tôi muốn nói với các nhà phát triển khác rằng giá trị này là một hằng số cụ thể chứ không chỉ là một biến."

Ví dụ: chúng tôi muốn tính thuế bán hàng dựa trên giá:

public int getPriceNDS()
{
 final int NDS = 20;
 return this.price * NDS / 200;
}

"Và thứ hai, chúng ta cần loại biến này khi viết các lớp bên trong cục bộ hoặc ẩn danh. Tôi sẽ sớm cho bạn biết về các loại lớp này. Nhưng không phải hôm nay."

"Được rồi, cho tới nay cũng không có chuyện gì quá phức tạp."

"Xin lưu ý rằng chỉ có biến trở nên không thể thay đổi, không phải đối tượng mà nó có thể đề cập đến. Đối tượng vẫn có thể được thay đổi."

"Tôi thực sự chỉ định hỏi về điều đó. Và không có cách nào để làm cho đối tượng không thể thay đổi?"

"Không, trừ khi bạn viết một lớp bất biến."

"Xin lưu ý rằng vì không thể thay đổi giá trị của biến cuối cùng nên bạn phải gán giá trị ban đầu của nó ngay lập tức."

Mã này sẽ biên dịch Mã này sẽ không biên dịch
class Home
{
 private final int width = 200;
 private final int height = 100;

 public Home()
 {
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
 }
}

"Tuy nhiên, điều đó nói rằng, Java cho phép bạn trì hoãn việc khởi tạo các biến cuối cùng của một lớp cho đến khi hàm tạo."

Mã này sẽ biên dịch Mã này sẽ không biên dịch
class Home
{
 private final int width = 200;
 private final int height;

 public Home()
 {
  height = 100;
 }
}
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
 }
}

"Ngoài ra, các hàm tạo khác nhau có thể khởi tạo các biến cuối cùng với các giá trị khác nhau. Điều này khá tiện lợi:"

Mã này sẽ biên dịch
class Home
{
 private final int width;
 private final int height;

 public Home()
 {
  height = 100;
  width = 200;
 }

 public Home(int width)
 {
  this.height = 300;
  this.width = width;
 }

 public Home(int width, int height)
 {
  this.height = height;
  this.width = width;
 }
}

"Đó là một chủ đề thực sự thú vị, và mọi thứ hoàn toàn có ý nghĩa. Cảm ơn, Bilaabo!"