一般来说,将私有类声明为静态是否有任何好处?
在什么情况下我想使用以下哪一项?
private static class Foo
{
...
}
VS
private class Foo
{
...
}
答案 0 :(得分:40)
我认为这是一个很好的起点: http://java67.blogspot.fi/2012/10/nested-class-java-static-vs-non-static-inner.html
1)嵌套静态类不需要引用外类但不引用 静态嵌套类或内部类需要外部类引用。您 如果不创建实例,则无法创建Inner类的实例 外课。这是迄今为止最重要的考虑因素 使嵌套类静态或非静态。
2)静态类实际上是类的静态成员,可以用于 静态上下文外类的静态方法或静态块。
3)静态和非静态嵌套类之间的另一个区别是 您无法访问非静态成员,例如方法和领域 直接嵌套静态类。如果你这样做,你会得到像“非”这样的错误 静态成员不能在静态上下文中使用“。而内部类 可以访问外类的静态和非静态成员。
答案 1 :(得分:2)
如果需要访问封闭类的成员变量/方法,请使用非静态表单。如果不这样做,请使用静态表单。
答案 2 :(得分:1)
我认为你指的是内部类。
我认为动机来自你想要如何关联你的内心阶级。如果您希望内部类与其外部类的特定实例相关联,则使用private class
,否则使用private static class
。
答案 3 :(得分:0)
我发现在通用抽象类中有一个特定的异常很有用。即:
public abstract class AbstractClass <T>
{
private void doSomethingOrThrowException() throws SpecificException
{
....
if ( ! successful)
{
throw new SpecificException();
}
}
private static class SpecificException extends Exception {}
}
如果我要省略静态,编译器会给我一个错误,指出:The generic class AbstractClass<T>.SpecificException may not subclass java.lang.Throwable
答案 4 :(得分:0)
如果我理解正确,那么问题是针对私有类与私有静态类。所有回答通常都是关于内部类的,并非100%适用于该问题。所以首先要做的是:
正如被接受的回答所说,静态和非静态嵌套类在访问外部类之外的方法/字段的方式和可能性上有所不同。但是,如果在A类中使用私有B类,则不会出现此问题,原因是无论如何A都无法访问B。
现在,从类A内部,对于非静态字段/方法,您始终可以通过说new A.B()
或仅new B()
来引用类B,这无关紧要(没有编译/运行时错误),如果B是私有类或私有静态类。如果是静态字段/方法,则需要使用私有静态类。
此外,如果要从B内部访问A的非静态字段,则不能将B作为私有静态类。
我通常更喜欢私有静态类,除非我不能像以前那样使用它,否则intellij会给出警告。
答案 5 :(得分:-1)
静态类与普通类的不同之处仅在于它们可以在不创建实例的情况下访问它们。因此,如果您需要每次都可以访问某个类,请使用静态