Статический вложенный класс в Java, почему? - PullRequest
201 голосов
/ 31 октября 2008

Я просматривал код Java для LinkedList и заметил, что он использует статический вложенный класс, Entry.

public class LinkedList<E> ... {
...

 private static class Entry<E> { ... }

}

В чем причина использования статического вложенного класса, а не обычного внутреннего класса?

Единственная причина, о которой я мог подумать, это то, что Entry не имеет доступа к переменным экземпляра, поэтому с точки зрения ООП он лучше инкапсулируется.

Но я подумал, что могут быть и другие причины, например, производительность. Что бы это могло быть?

Примечание. Я надеюсь, что мои термины верны, я бы назвал это статическим внутренним классом, но я думаю, что это неправильно: http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html

Ответы [ 13 ]

0 голосов
/ 22 октября 2016

Использование статического вложенного класса вместо нестатического может в некоторых случаях сэкономить место. Например: реализация Comparator внутри класса, скажем Student.

public class Student {
  public static final Comparator<Student> BY_NAME = new ByName();
  private final String name;
  ...
  private static class ByName implements Comparator<Student> {
    public int compare() {...}
  }
}

Тогда static гарантирует, что в классе Student есть только один Comparator, а не создает новый экземпляр каждый раз, когда создается новый экземпляр Student.

0 голосов
/ 01 марта 2016

Преимущество внутреннего класса -

  1. одноразовое использование
  2. поддерживает и улучшает инкапсуляцию
  3. удобочитаемость
  4. доступ к частному полю

Без существующего внешнего класса внутренний класс не будет существовать.

class car{
    class wheel{

    }
}

Существует четыре типа внутреннего класса.

  1. нормальный внутренний класс
  2. Метод Local Inner class
  3. Анонимный внутренний класс
  4. статический внутренний класс

точка ---

  1. из статического внутреннего класса, мы можем получить доступ только к статическому члену внешнего класса.
  2. Внутри внутреннего класса мы не можем объявить статический член.
  3. порядок вызова нормального внутреннего класса в статической области внешнего класса.

    Outer 0=new Outer(); Outer.Inner i= O.new Inner();

  4. Порядок вызова нормального внутреннего класса в области экземпляра внешнего класса.

    Inner i=new Inner();

  5. порядок вызова нормального внутреннего класса снаружи внешнего класса.

    Outer 0=new Outer(); Outer.Inner i= O.new Inner();

  6. внутри внутреннего класса Этот указатель на внутренний класс.

    this.member-current inner class outerclassname.this--outer class

  7. для внутреннего класса применим модификатор - public, по умолчанию,

    final,abstract,strictfp,+private,protected,static

  8. external $ inner - имя внутреннего имени класса.

  9. внутренний класс внутри метода экземпляра, тогда мы можем получить доступ к статическому и экземпляру поля внешнего класса.

10. внутри класса static, тогда мы можем получить доступ только к статическому полю

внешний класс.

class outer{

    int x=10;
    static int y-20;

    public void m1() {
        int i=30;
        final j=40;

        class inner{

            public void m2() {
                // have accees x,y and j
            }
        }
    }
}
0 голосов
/ 31 октября 2008

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

Это немного похоже на то, почему я всегда делаю свои переменные окончательными в Java - если они не окончательные, я знаю, что с ними происходит что-то смешное. Если вы используете внутренний класс вместо статического вложенного класса, на это должна быть веская причина.

...