Eclipse, предупреждающий о синтетическом средстве доступа для частных статических вложенных классов в Java?

У меня была такая же проблема с CentOS 6.5. Перед этой ошибкой я нашел причину ошибки следующим образом.

AAPT err(Facade for 1129807373): xxx/aapt: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by xxx/lib64/libc++.so)

« libc.so.6: версия` GLIBC_2.14 'не найдена ». Самая высокая версия CentOS 6.5 - 2.12, и нам нужно обновить ее до 2.14.

Показать установленную версию glibc:

# rpm -qa | grep glibc

Для загрузки соответствующего пакета RPM. -> ftp.redsleeve.org/pub/steam/

Установите пакет RPM следующим образом:

# rpm -Uvh glibc-2.15-60.el6.x86_64.rpm glibc-common-2.15-60.el6.x86_64.rpm glibc-devel-2.15-60.el6.x86_64.rpm glibc-headers-2.15-60.el6.x86_64.rpm --nodeps --force

47
задан Mr_and_Mrs_D 19 October 2013 в 10:59
поделиться

4 ответа

Вы можете избавиться от предупреждения следующим образом:

package com.example.bugs;

public class WeirdInnerClassJavaWarning {
    private static class InnerClass {
        protected InnerClass() {}  // This constructor makes the warning go away
        public void doSomething() {}
    }

    final private InnerClass anInstance;
    {
        this.anInstance = new InnerClass(); 
        this.anInstance.doSomething();
    }
}

Как говорили другие, Eclipse жалуется, потому что частный класс без явного конструктора не может быть создан извне, кроме как с помощью синтетического метода что создает компилятор Java. Если вы возьмете свой код, скомпилируете его, а затем декомпилируете с помощью jad (*), вы получите следующее (переформатировано):

public class Test {
  private static class InnerClass {
    public void doSomething() {}
    // DEFAULT CONSTRUCTOR GENERATED BY COMPILER:
    private InnerClass() {}

    // SYNTHETIC METHOD GENERATED BY THE JAVA COMPILER:    
    InnerClass(InnerClass innerclass) {
      this();
    }
  }

  public Test() {
    anInstance.doSomething();
  }

  // Your instance initialization as modified by the compiler:
  private final InnerClass anInstance = new InnerClass(null);
}

Если вы добавите защищенный конструктор, синтетический код не понадобится. Синтетический код теоретически, я полагаю, на мизерную величину медленнее, чем несинтетический код, использующий общедоступный или защищенный конструктор.

(*) Для jad я связался со страницей Википедии ... доменом, на котором размещена эта программа истек, но Википедия ссылается на другую, которую я сам не тестировал. Я знаю, что есть и другие (возможно, более свежие) декомпиляторы, но это тот, который я начал использовать. Примечание: он жалуется при декомпиляции последних файлов классов Java, но по-прежнему выполняет свою работу хорошо.

43
ответ дан 26 November 2019 в 19:44
поделиться

Вы не можете создать экземпляр InnerClass из WeirdInnerClassJavaWarning. Это конфиденциально, JVM не позволит вам, но язык Java (по какой-то причине) будет.

Таким образом, javac создаст дополнительный метод в InnerClass, который будет просто возвращать new InnerClass (), что позволит вам создать InnerClass экземпляры из WeirdInnerClassJavaWarning.

Я не думаю, что вам действительно нужно избавляться от него, потому что падение производительности будет неизмеримо маленьким. Однако вы можете, если действительно хотите.

9
ответ дан 26 November 2019 в 19:44
поделиться

Вы сможете избавиться от него, используя область видимости по умолчанию вместо частной или защищенной, т.е.

static class InnerClass ...

. Также стоит отметить, что я помещаю ваш курсор в строку кода с предупреждения и нажатия ctrl-1, Eclipse может исправить это автоматически.

0
ответ дан 26 November 2019 в 19:44
поделиться

Я до сих пор не понимаю, почему создание защищенного вложенного класса, а не частного - это еще один метод решения "проблемы", но, возможно, это причуда / ошибка Eclipse

Это не причуда / ошибка Eclipse, а просто функция Java. Спецификация языка Java, 8.8.9 гласит:

... если класс объявлен защищенным, то конструктору по умолчанию неявно присваивается модификатор доступа protected ...

3
ответ дан 26 November 2019 в 19:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: