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