Java 匿名内部クラスのパフォーマンスを最適化するにはどうすればよいですか?

王林
リリース: 2024-05-02 08:48:01
オリジナル
882 人が閲覧しました

匿名内部クラスのパフォーマンスの問題は、使用するたびに再作成されることです。これは、次の方法で最適化できます。 1. 匿名内部クラスをローカル変数に格納します。 2. 非静的内部クラスを使用します。ラムダ式を使用します。実際のテストでは、ラムダ式の最適化が最も効果的であることが示されています。

Java 匿名内部类如何优化性能?

#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. ラムダ式の使用

Java 8 以降では、匿名内部クラスの代わりにラムダ式を使用できます。ラムダ式はより簡潔であり、オブジェクトの繰り返し作成を回避します。

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
ログイン後にコピー

出力が示すように、ラムダ式を使用すると、匿名内部クラスのパフォーマンスを大幅に最適化できます。

以上がJava 匿名内部クラスのパフォーマンスを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート