匿名內部類別的效能問題在於每次使用都會重新創建,可透過以下策略最佳化:1. 將匿名內部類別儲存在局部變數中;2. 使用非靜態內部類別;3. 使用 lambda 表達式。實戰測試顯示 lambda 表達式最佳化效果最佳。
Java 匿名內部類別最佳化效能
「簡介
匿名內部類別是一種匿名類,它沒有明確的名稱。它們通常用於在方法中建立快速實作介面或繼承類別的物件。雖然匿名內部類別使用方便,但它們也可能對效能產生負面影響。
效能問題
匿名內部類別的效能問題主要源自於它們每次使用時都會重新建立。這會導致不必要的物件分配和初始化開銷。
優化策略
優化匿名內部類別效能的主要策略是避免每次使用時重新建立它們。這可以透過以下方法實現:
1. 將匿名內部類別儲存在局部變數中
// 每次使用时新建匿名内部类 JButton button = new JButton(); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // ... } }); // 将匿名内部类存储在局部变量中 ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // ... } }; button.addActionListener(listener);
2. 使用非靜態內部類別
非靜態內部類別可以存取外部類別的實例變數和方法。透過將匿名內部類別宣告為非靜態內部類,可以避免每次使用時重新建立外部類別。
public class MyFrame { private JButton button; public MyFrame() { button = new JButton(); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 可以访问外部类的变量和方法 System.out.println(button.getText()); } }); } }
3. 使用 lambda 表達式
在 Java 8 及更高版本中,可以使用 lambda 表達式取代匿名內部類別。 lambda 表達式較簡潔,並且可以避免重複建立物件。
JButton button = new JButton(); button.addActionListener(e -> System.out.println(button.getText()));
實戰案例
以下是一個實戰案例,展示了最佳化匿名內部類別的效能:
public class Benchmark { public static void main(String[] args) { long startTime = System.currentTimeMillis(); // 使用匿名内部类 for (int i = 0; i < 100000; i++) { JButton button = new JButton(); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // ... } }); } long endTime = System.currentTimeMillis(); System.out.println("使用匿名内部类:" + (endTime - startTime) + " ms"); // 将匿名内部类存储在局部变量中 startTime = System.currentTimeMillis(); ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // ... } }; for (int i = 0; i < 100000; i++) { JButton button = new JButton(); button.addActionListener(listener); } endTime = System.currentTimeMillis(); System.out.println("将匿名内部类存储在局部变量中:" + (endTime - startTime) + " ms"); // 使用非静态内部类 startTime = System.currentTimeMillis(); class MyActionListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { // ... } } for (int i = 0; i < 100000; i++) { JButton button = new JButton(); button.addActionListener(new MyActionListener()); } endTime = System.currentTimeMillis(); System.out.println("使用非静态内部类:" + (endTime - startTime) + " ms"); // 使用 lambda 表达式 startTime = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { JButton button = new JButton(); button.addActionListener(e -> { // ... }); } endTime = System.currentTimeMillis(); System.out.println("使用 lambda 表达式:" + (endTime - startTime) + " ms"); } }
輸出:
使用匿名内部类:2256 ms 将匿名内部类存储在局部变量中:142 ms 使用非静态内部类:2232 ms 使用 lambda 表达式:56 ms
如輸出所示,使用lambda 表達式可以顯著最佳化匿名內部類別的效能。
以上是Java 匿名內部類別如何優化效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!