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

Class cha có Method chứa inner class, method đó sử dụng biến ngoài inner class và trong method, biến đó phải là final hoặc effective final

0 0 10

Người đăng: VND

Theo Viblo Asia

Class cha có Method chứa inner class, method đó sử dụng biến ngoài inner class và trong method, biến đó phải là final hoặc effective final. Môi trường: Java language level 19, JDK 19. Bạn có thể dùng kiến thức này cho các Java language level hoặc JDK rất thấp, tuy nhiên tôi muốn cụ thể hóa cho một phiên bản Java hiện tại.

Ví dụ minh họa, lưu ý rằng nó không thể biên dịch.

public class PrintNumbers { private int length = 4; public void calculate() { final int width = 5; class Calculator { public void multiply() { System.out.println(length * width); } } var calculator = new Calculator(); calculator.multiply(); } public static void main(String[] args) { var printer = new PrintNumbers(); printer.calculate(); } public void processData(){ final int length = 1; int width = 2; int height = 3; class VolumeCalculator{ public int multiply(){ return length * width * height; } } width = 2; }
}

Nguyên nhân gây rà lỗi khoogn thể biên dịch: Tại dòng return length * width * height; sử dụng biến width không ở trạng thái final, constructor VolumeCalculator không thể xác định được width = 3 hay = 2. Có 2 trường hợp cần phân biệt:

  • final (1), và
  • effective final (2).

Đoạn code trên rơi vào trường hợp (2) đó là effective final. Cách fix có 2 cách --> đưa width về (1) --> Solution (S1) hoặc (2) --> Solution (S2). Đó là

(S1): Final

public class PrintNumbers { private int length = 4; public void calculate() { final int width = 5; class Calculator { public void multiply() { System.out.println(length * width); } } var calculator = new Calculator(); calculator.multiply(); } public static void main(String[] args) { var printer = new PrintNumbers(); printer.calculate(); } public void processData(){ final int length = 1; final int width = 2; int height = 3; class VolumeCalculator{ public int multiply(){ return length * width * height; } } // width = 2; }
}

S2: Effective final

public class PrintNumbers { private int length = 4; public void calculate() { final int width = 5; class Calculator { public void multiply() { System.out.println(length * width); } } var calculator = new Calculator(); calculator.multiply(); } public static void main(String[] args) { var printer = new PrintNumbers(); printer.calculate(); } public void processData(){ final int length = 1; int width = 2; int height = 3; class VolumeCalculator{ public int multiply(){ return length * width * height; } } // width = 6; }
}

Các bạn thấy đấy, int width = 10 đâu cần final, chương trình vẫn hoạt động được, vì nó không gây ra nhầm lẫn về giá trị biến width được dùng trong method bên trong inner class, cái này gọi là effective final (final một cách ngầm định).

Tài liệu đặc tả ngôn ngữ Java - language level 19: https://docs.oracle.com/javase/specs/jls/se19/html/jls-8.html#d5e12966:~:text=Example 8.1.3-2. Inner Class Declarations

Mã nguồn: https://gist.github.com/donhuvy/f44cbcdf73f88f8e1b60445e64d8dbfc#file-printnumbers-java-L23

Bình luận

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

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

Một số thủ thuật hay ho với Linux (1).

1. Ctrl + x + e. Giữ CTRL, nhấn phím x rồi nhấn phím e. Thao tác này sẽ mở ra editor mặc định (echo $EDITOR | $VISUAL để kiểm tra) chứa sẵn.

0 0 45

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

How to deploy Amplication app to DigitalOcean

This article shows you the way to deploy an app generated by Amplication to DigitalOcean. Amplication provides the dockerfile to use containers for deployment, but this blog explains how to do it manu

0 0 53

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

Có gì mới trong Laravel 9.0?

Laravel v9 là phiên bản LTS tiếp theo của Laravel và ra mắt vào tháng 2 năm 2022. Trong bài viết này, mình xin giới thiệu một vài tính năng mới trong Laravel trong Laravel 9.

0 0 78

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

Xây dựng trang web tra cứu ảnh sử dụng phân cụm Spectral Clustering

1. Tổng quan tra cứu ảnh. 1.1.

0 0 45

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

Scanning network 1 - quét mạng như một hacker

Chào mọi người mình là Tuntun. Một năm qua là một năm khá bận rộn nhỉ.

0 0 46

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

Interpreter Design Pattern - Trợ thủ đắc lực của Developers

1. Giới thiệu. . Interpreter là một mẫu thiết kế thuộc nhóm hành vi (Behavioral Pattern).

0 0 43