Эффективность Java "инициализации двойной скобки"?

Одно из свойств этого подхода, на jdk которое до сих пор не указывалось, заключается openjdk в том, что, поскольку вы java-collections-api создаете внутренние классы, весь initialization содержащий класс захватывается java-collections-api в его области видимости. Это jdk означает, что пока ваш Set performance жив, он будет сохранять указатель collection на содержащий его экземпляр initialize (this$0) и предохранять его от slow сборки мусора, что может javax быть проблемой.

Это, а также performance тот факт, что в первую очередь java создается новый класс, даже slow если обычный HashSet будет efficiency работать нормально (или даже collections лучше), заставляет меня не jdk использовать эту конструкцию javax (хотя я очень хочу синтаксического java сахар).

Второй вопрос: новый speed HashSet должен быть «this», используемым initialize в инициализаторе экземпляра jdk ... может ли кто-нибудь пролить initialisation свет на механизм? Я наивно jdk ожидал, что «this» будет openjdk относиться к объекту, инициализирующему initialisation «ароматы».

Так работают внутренние initialization классы. У них есть собственный performance this, но у них также есть указатели javax на родительский экземпляр, так jre что вы также можете вызывать efficiency методы для содержащего объекта. В initialize случае конфликта имен внутренний collection класс (в вашем случае HashSet) имеет initialize приоритет, но вы можете добавить slow префикс «this» к имени класса, чтобы speed получить и внешний метод.

public class Test {

    public void add(Object o) {
    }

    public Set makeSet() {
        return new HashSet() {
            {
              add("hello"); // HashSet
              Test.this.add("hello"); // outer instance 
            }
        };
    }
}

Чтобы slow иметь ясное представление uninitialized о создаваемом анонимном подклассе, вы javax также можете определить там collections методы. Например, переопределить collections HashSet.add()

    public Set makeSet() {
        return new HashSet() {
            {
              add("hello"); // not HashSet anymore ...
            }

            @Override
            boolean add(String s){

            }

        };
    }

java

performance

collections

initialization

2022-11-05T05:56:42+00:00
Вопросы с похожей тематикой, как у вопроса:

Эффективность Java "инициализации двойной скобки"?