Действительно ли возможно сделать анонимные внутренние классы в Java статичными?

Попробуйте это:

df1 %>%
  group_by(cat, cl) %>%
  do(ids=paste(  inner_join(.,df2) %>%
                 dplyr::pull(id), collapse=';'))

Не совсем точно, почему это работает, но это так.

118
задан Sotirios Delimanolis 29 April 2016 в 00:00
поделиться

4 ответа

Нет, вы не можете, и нет, компилятор не может понять это. Вот почему FindBugs всегда предлагает изменить анонимные внутренние классы на именованные статические вложенные классы, если они не используют свою неявную эту ссылку.

Редактировать: Tom Hawtin - tackline говорит, что если анонимный класс создается в статическом контексте (например, в методе main ), анонимный класс фактически является статическим . Но JLS не согласен :

Анонимный класс никогда не является абстрактным (§8.1.1.1). Анонимный класс всегда является внутренним классом (§8.1.3); оно никогда не статично (§8.1.1, §8.5.1). Анонимный класс всегда неявно final (§8.1.1.2).

Roedy Green ' Глоссарий Java говорит, что факт, что анонимные классы разрешены в статическом контексте, зависит от реализации:

Если вы хотите сбить с толку тех, кто поддерживает ваш код, wags обнаружили javac.exe разрешит анонимные классы внутри статического кода инициализации и статического метода, даже если спецификация языка говорит, что анонимные классы никогда не являются статическими . Эти анонимные классы, конечно, не имеют доступа к полям экземпляра объекта. Я не рекомендую делать это. Функция может быть удалена в любое время.

Редактировать 2: JLS на самом деле более четко охватывает статические контексты в §15.9.2 :

Пусть C будет классом, для которого создается экземпляр, и пусть ] i будет создаваемым экземпляром. Если C является внутренним классом, то i может иметь непосредственно включающий экземпляр. Непосредственно включающий экземпляр i (§8.1.3) определяется следующим образом.

  • Если C является анонимным классом, то:
    • Если выражение создания экземпляра класса происходит в статическом контексте (§8.1.3), то i не имеет немедленно включающего экземпляра.
    • В противном случае немедленно включающий экземпляр i является этим .

Таким образом, анонимный класс в статическом контексте примерно эквивалентен вложенному статическому класс в том смысле, что он не хранит ссылку на включающий класс, хотя технически он не является статическим классом.

134
ответ дан 24 November 2019 в 01:59
поделиться

Внутренние классы не могут быть статическими - статический вложенный класс не является внутренним классом. Об этом здесь рассказывается в руководстве по Java .

6
ответ дан 24 November 2019 в 01:59
поделиться

Я думаю, что здесь есть небольшая путаница в номенклатуре, которая, по общему признанию, слишком глупа и сбивает с толку.

как вы их называете, эти шаблоны (и несколько вариантов с разной видимостью) являются всеми возможными, нормальными, легальными Java:

public class MyClass {
  class MyClassInside {
  }
}

public class MyClass {
  public static class MyClassInside {
  }
}

public class MyClass {
  public void method() {
    JComponent jc = new JComponent() {
      ...
    }
  }
}

public class MyClass {
  public static void myStaticMethod() {
    JComponent jc = new JComponent() {
      ...
    }
  }
}

Они учтены в спецификации языка (если вы действительно обеспокоены, см. раздел 15.9). 5.1 для одного внутри статического метода).

Но эта цитата просто неверна :

javac.exe разрешит анонимный доступ классы внутри статического кода инициализации и статические методы, хотя спецификация языка говорит чем аноним классы никогда не бывают статическими

Я думаю, что цитируемый автор путает ключевое слово static со статическим контекстом . (Следует признать, что JLS также немного сбивает с толку в этом отношении.)

Честно говоря, все вышеприведенные шаблоны хороши (как бы вы их ни называли «вложенными», «внутренними», «анонимными», как угодно ...). Действительно, никто не собирается внезапно удалять эту функциональность в следующем выпуске Java. Честно!

14
ответ дан 24 November 2019 в 01:59
поделиться

Вид. Анонимный внутренний класс, созданный в статическом методе, очевидно, будет эффективно статическим, потому что нет никакого внешнего источника для внешнего.

Есть некоторые технические различия между внутренними классами в статических контекстах и ​​статическими вложенными классами. Если вам интересно, прочитайте JLS 3rd Ed.

15
ответ дан 24 November 2019 в 01:59
поделиться
Другие вопросы по тегам:

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