Rumah  >  Artikel  >  Java  >  Bagaimana untuk mengoptimumkan prestasi kelas dalaman tanpa nama Java?

Bagaimana untuk mengoptimumkan prestasi kelas dalaman tanpa nama Java?

王林
王林asal
2024-05-02 08:48:01823semak imbas

Masalah prestasi kelas dalaman tanpa nama ialah ia dicipta semula setiap kali ia digunakan, yang boleh dioptimumkan melalui strategi berikut: 1. Simpan kelas dalaman tanpa nama dalam pembolehubah tempatan 2. Gunakan kelas dalaman bukan statik; ungkapan lambda. Ujian praktikal menunjukkan bahawa pengoptimuman ungkapan lambda berfungsi dengan baik.

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

Java Anonymous Inner Class Mengoptimumkan Prestasi

Pengenalan

Anonymous Inner Class ialah kelas tanpa nama yang tidak mempunyai nama yang jelas. Mereka sering digunakan dalam kaedah untuk mencipta objek yang cepat melaksanakan antara muka atau kelas yang diwarisi. Walaupun kelas dalaman tanpa nama mudah digunakan, ia juga boleh memberi kesan negatif terhadap prestasi.

Isu Prestasi

Isu prestasi dengan kelas dalaman tanpa nama terutamanya berpunca daripada fakta bahawa ia dicipta semula setiap kali ia digunakan. Ini mengakibatkan peruntukan objek dan overhed permulaan yang tidak perlu.

Strategi Pengoptimuman

Strategi utama untuk mengoptimumkan prestasi kelas dalaman tanpa nama adalah untuk mengelak daripada mencipta semula setiap kali ia digunakan. Ini boleh dicapai dengan:

1. Simpan kelas dalaman tanpa nama dalam pembolehubah tempatan

// 每次使用时新建匿名内部类
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. Gunakan kelas dalaman bukan statik

Kelas dalaman bukan statik boleh mengakses kelas dan kaedah instance. Dengan mengisytiharkan kelas dalam tanpa nama sebagai kelas dalam bukan statik, anda boleh mengelak daripada mencipta semula kelas luar setiap kali ia digunakan.

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. Menggunakan ungkapan lambda

Dalam Java 8 dan ke atas, anda boleh menggunakan ungkapan lambda dan bukannya kelas dalaman tanpa nama. Ungkapan Lambda lebih ringkas dan mengelakkan penciptaan objek berulang.

JButton button = new JButton();
button.addActionListener(e -> System.out.println(button.getText()));

Satu kes praktikal

Berikut ialah kes praktikal yang menunjukkan prestasi mengoptimumkan kelas dalaman tanpa nama:

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");
    }

}

Output:

使用匿名内部类:2256 ms
将匿名内部类存储在局部变量中:142 ms
使用非静态内部类:2232 ms
使用 lambda 表达式:56 ms

Seperti yang ditunjukkan oleh kelas dalaman tanpa nama, boleh dioptimumkan secara signifikan, seperti yang ditunjukkan oleh kelas dalaman tanpa nama, boleh dioptimumkan dengan ketara. prestasi ungkapan.

Atas ialah kandungan terperinci Bagaimana untuk mengoptimumkan prestasi kelas dalaman tanpa nama Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn