Maison > Java > javaDidacticiel > Comment optimiser les performances des classes internes anonymes Java ?

Comment optimiser les performances des classes internes anonymes Java ?

王林
Libérer: 2024-05-02 08:48:01
original
937 Les gens l'ont consulté

Le problème de performances des classes internes anonymes est qu'elles sont recréées à chaque fois qu'elles sont utilisées, ce qui peut être optimisé grâce aux stratégies suivantes : 1. Stocker les classes internes anonymes dans des variables locales 2. Utiliser des classes internes non statiques ; expressions lambda. Des tests pratiques montrent que l'optimisation des expressions lambda fonctionne mieux.

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

La classe interne anonyme Java optimise les performances

Introduction

La classe interne anonyme est une classe anonyme qui n'a pas de nom explicite. Ils sont souvent utilisés dans des méthodes pour créer des objets qui implémentent rapidement des interfaces ou des classes héritées. Bien que les classes internes anonymes soient pratiques à utiliser, elles peuvent également avoir un impact négatif sur les performances.

Problèmes de performances

Les problèmes de performances avec les classes internes anonymes proviennent principalement du fait qu'elles sont recréées à chaque fois qu'elles sont utilisées. Cela entraîne une allocation d’objets inutile et une surcharge d’initialisation.

Stratégies d'optimisation

La principale stratégie pour optimiser les performances des classes internes anonymes est d'éviter de les recréer à chaque fois qu'elles sont utilisées. Ceci peut être réalisé en :

1. Stockez les classes internes anonymes dans des variables locales

// 每次使用时新建匿名内部类
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);
Copier après la connexion

2. Utilisez des classes internes non statiques

Les classes internes non statiques peuvent accéder aux variables d'instance et aux méthodes des classes externes. En déclarant une classe interne anonyme comme classe interne non statique, vous pouvez éviter de recréer la classe externe à chaque fois qu'elle est utilisée.

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

}
Copier après la connexion

3. Utilisation d'expressions lambda

Dans Java 8 et supérieur, vous pouvez utiliser des expressions lambda au lieu de classes internes anonymes. Les expressions Lambda sont plus concises et évitent la création répétée d'objets.

JButton button = new JButton();
button.addActionListener(e -> System.out.println(button.getText()));
Copier après la connexion

Un cas pratique

Ce qui suit est un cas pratique qui démontre les performances de l'optimisation des classes internes anonymes :

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

}
Copier après la connexion

Sortie :

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

Comme le montre la sortie, les classes internes anonymes peuvent être considérablement optimisées à l'aide de lambda performances des expressions.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers numéros
Impossible d'installer Java
Depuis 1970-01-01 08:00:00
0
0
0
Java peut-il être utilisé comme backend du Web ?
Depuis 1970-01-01 08:00:00
0
0
0
Installer JAVA
Depuis 1970-01-01 08:00:00
0
0
0
Aide : Données chiffrées JAVA Décryptage PHP
Depuis 1970-01-01 08:00:00
0
0
0
Est-ce en langage Java ?
Depuis 1970-01-01 08:00:00
0
0
0
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal