Static nested class in Java, why?

2019-01-01 10:07发布

I was looking at the Java code for LinkedList and noticed that it made use of a static nested class, Entry.

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

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

}

What is the reason for using a static nested class, rather than an normal inner class?

The only reason I could think of, was that Entry doesn't have access to instance variables, so from an OOP point of view it has better encapsulation.

But I thought there might be other reasons, maybe performance. What might it be?

Note. I hope I have got my terms correct, I would have called it a static inner class, but I think this is wrong: http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html

13条回答
路过你的时光
2楼-- · 2019-01-01 10:21

One of the reasons for static vs. normal have to do with classloading. You cannot instantiate an inner class in the constructor of it's parent.

PS: I've always understood 'nested' and 'inner' to be interchangeable. There may be subtle nuances in the terms but most Java developers would understand either.

查看更多
梦该遗忘
3楼-- · 2019-01-01 10:22

The Sun page you link to has some key differences between the two:

A nested class is a member of its enclosing class. Non-static nested classes (inner classes) have access to other members of the enclosing class, even if they are declared private. Static nested classes do not have access to other members of the enclosing class.
...

Note: A static nested class interacts with the instance members of its outer class (and other classes) just like any other top-level class. In effect, a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience.

There is no need for LinkedList.Entry to be top-level class as it is only used by LinkedList (there are some other interfaces that also have static nested classes named Entry, such as Map.Entry - same concept). And since it does not need access to LinkedList's members, it makes sense for it to be static - it's a much cleaner approach.

As Jon Skeet points out, I think it is a better idea if you are using a nested class is to start off with it being static, and then decide if it really needs to be non-static based on your usage.

查看更多
深知你不懂我心
4楼-- · 2019-01-01 10:27

Simple example :

package test;

public class UpperClass {
public static class StaticInnerClass {}

public class InnerClass {}

public static void main(String[] args) {
    // works
    StaticInnerClass stat = new StaticInnerClass();
    // doesn't compile
    InnerClass inner = new InnerClass();
}
}

If non-static the class cannot be instantiated exept in an instance of the upper class (so not in the example where main is a static function)

查看更多
荒废的爱情
5楼-- · 2019-01-01 10:30

Adavantage of inner class--

  1. one time use
  2. supports and improves encapsulation
  3. readibility
  4. private field access

Without existing of outer class inner class will not exist.

class car{
    class wheel{

    }
}

There are four types of inner class.

  1. normal inner class
  2. Method Local Inner class
  3. Anonymous inner class
  4. static inner class

point ---

  1. from static inner class ,we can only access static member of outer class.
  2. Inside inner class we cananot declare static member .
  3. inorder to invoke normal inner class in static area of outer class.

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

  4. inorder to invoke normal inner class in instance area of outer class.

    Inner i=new Inner();

  5. inorder to invoke normal inner class in outside of outer class.

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

  6. inside Inner class This pointer to inner class.

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

  7. for inner class applicable modifier is -- public,default,

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

  8. outer$inner is the name of inner class name.

  9. inner class inside instance method then we can acess static and instance field of outer class.

10.inner class inside static method then we can access only static field of

outer class.

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
            }
        }
    }
}
查看更多
人间绝色
6楼-- · 2019-01-01 10:31

Static inner class is used in the builder pattern. Static inner class can instantiate it's outer class which has only private constructor. So you can use static inner class to instantiate the outer class which only has private constructor. You can not do the same with the inner class as you need to have object of the outer class created prior to accessing the inner class.

class OuterClass {
    private OuterClass(int x) {
        System.out.println("x: " + x);
    }

    static class InnerClass {
        public static void test() {
            OuterClass outer = new OuterClass(1);
        }
    }
}

public class Test {
    public static void main(String[] args) {
        OuterClass.InnerClass.test();
        // OuterClass outer = new OuterClass(1); // It is not possible to create outer instance from outside.
    }
}

This will output x: 1

查看更多
深知你不懂我心
7楼-- · 2019-01-01 10:33

Using a static nested class rather than non-static one may save spaces in some cases. For example: implementing a Comparator inside a class, say 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() {...}
  }
}

Then the static ensures that the Student class has only one Comparator, rather than instantiate a new one every time a new student instance is created.

查看更多
登录 后发表回答