>  기사  >  Java  >  Java 익명 내부 클래스의 성능을 최적화하는 방법은 무엇입니까?

Java 익명 내부 클래스의 성능을 최적화하는 방법은 무엇입니까?

王林
王林원래의
2024-05-02 08:48:01823검색

익명 내부 클래스의 성능 문제는 사용될 때마다 다시 생성된다는 것입니다. 이는 다음 전략을 통해 최적화할 수 있습니다. 1. 익명 내부 클래스를 로컬 변수에 저장합니다. 2. 비정적 내부 클래스를 사용합니다. 람다 표현식. 실제 테스트에서는 람다 식 최적화가 가장 잘 작동하는 것으로 나타났습니다.

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

Java 익명 내부 클래스로 성능 최적화

소개

익명 내부 클래스는 명시적인 이름이 없는 익명 클래스입니다. 인터페이스나 상속된 클래스를 빠르게 구현하는 객체를 생성하기 위해 메서드에 자주 사용됩니다. 익명 내부 클래스는 사용하기 편리하지만 성능에 부정적인 영향을 미칠 수도 있습니다.

성능 문제

익명 내부 클래스의 성능 문제는 주로 사용할 때마다 다시 생성된다는 사실에서 비롯됩니다. 이로 인해 불필요한 객체 할당 및 초기화 오버헤드가 발생합니다.

최적화 전략

익명 내부 클래스의 성능을 최적화하기 위한 주요 전략은 사용될 때마다 다시 생성되지 않도록 하는 것입니다.

1. 익명 내부 클래스를 로컬 변수에 저장

// 每次使用时新建匿名内部类
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. 비정적 내부 클래스 사용

비정적 내부 클래스는 외부 클래스의 인스턴스 변수와 메서드에 액세스할 수 있습니다. 익명 내부 클래스를 비정적 내부 클래스로 선언하면 외부 클래스가 사용될 때마다 다시 생성되는 것을 피할 수 있습니다.

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. 람다 식 사용

Java 8 이상에서는 익명 내부 클래스 대신 람다 식을 사용할 수 있습니다. 람다 표현식은 더 간결하며 반복적인 객체 생성을 방지합니다.

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

실용 사례

다음은 익명 내부 클래스 최적화 성능을 보여주는 실제 사례입니다.

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

}

출력:

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

출력에서 알 수 있듯이 익명 내부 클래스는 람다 표현식을 사용하여 크게 최적화할 수 있습니다. 성능.

위 내용은 Java 익명 내부 클래스의 성능을 최적화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.