Heim  >  Artikel  >  Java  >  Wie kann die Leistung anonymer innerer Java-Klassen optimiert werden?

Wie kann die Leistung anonymer innerer Java-Klassen optimiert werden?

王林
王林Original
2024-05-02 08:48:01821Durchsuche

Das Leistungsproblem anonymer innerer Klassen besteht darin, dass sie bei jeder Verwendung neu erstellt werden. Dies kann durch die folgenden Strategien optimiert werden: 1. Speichern Sie anonyme innere Klassen in lokalen Variablen. 2. Verwenden Sie nicht statische innere Klassen Lambda-Ausdrücke. Praxistests zeigen, dass die Optimierung des Lambda-Ausdrucks am besten funktioniert.

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

Java Anonymous Inner Class optimiert die Leistung

Einführung

Anonymous Inner Class ist eine anonyme Klasse, die keinen expliziten Namen hat. Sie werden häufig in Methoden zum Erstellen von Objekten verwendet, die Schnittstellen oder geerbte Klassen schnell implementieren. Obwohl anonyme innere Klassen bequem zu verwenden sind, können sie sich auch negativ auf die Leistung auswirken.

Leistungsprobleme

Leistungsprobleme mit anonymen inneren Klassen sind hauptsächlich auf die Tatsache zurückzuführen, dass sie bei jeder Verwendung neu erstellt werden. Dies führt zu unnötigem Objektzuweisungs- und Initialisierungsaufwand.

Optimierungsstrategien

Die Hauptstrategie zur Optimierung der Leistung anonymer innerer Klassen besteht darin, zu vermeiden, dass sie bei jeder Verwendung neu erstellt werden. Dies kann erreicht werden durch:

1. Speichern Sie anonyme innere Klassen in lokalen Variablen.

// 每次使用时新建匿名内部类
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. Verwenden Sie nicht statische innere Klassen.

Nicht statische innere Klassen können auf Instanzvariablen und Methoden äußerer Klassen zugreifen. Indem Sie eine anonyme innere Klasse als nicht statische innere Klasse deklarieren, können Sie vermeiden, dass die äußere Klasse bei jeder Verwendung neu erstellt wird.

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. Verwenden von Lambda-Ausdrücken

In Java 8 und höher können Sie Lambda-Ausdrücke anstelle anonymer innerer Klassen verwenden. Lambda-Ausdrücke sind prägnanter und vermeiden die wiederholte Objekterstellung.

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

Ein praktischer Fall

Das Folgende ist ein praktischer Fall, der die Leistung der Optimierung anonymer innerer Klassen zeigt:

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

}

Ausgabe:

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

Wie die Ausgabe zeigt, können anonyme innere Klassen mithilfe von Lambda-Ausdrücken erheblich optimiert werden Leistung.

Das obige ist der detaillierte Inhalt vonWie kann die Leistung anonymer innerer Java-Klassen optimiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn