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 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!