variable usar sirve que para metodos metodo internas estaticos cuando clases clase atributo anonimas java class findbugs

usar - ¿Cuál es la ventaja de hacer una clase interna como estática con Java?



que es un atributo en java (5)

Tengo una clase interna en mi clase de Java.

Cuando ejecuto encontrar errores , recomienda (avisa) que sea estático.

¿Cuál es el punto de esta advertencia? ¿Cuál es la ventaja de hacer una clase interna como estática?


Si la clase anidada no accede a ninguna de las variables de la clase contenedora, puede hacerse estática. La ventaja de esto es que no necesita una instancia adjunta de la clase externa para usar la clase anidada.


Una clase interna estática es una cosa semánticamente más simple. Es como una clase de nivel superior, excepto que tiene más opciones de visibilidad (por ejemplo, puede hacerla privada).

Una razón importante para evitar las clases internas no estáticas es que son más complejas. Existe la referencia oculta a la clase externa (tal vez incluso más de una). Y un nombre simple en un método de la clase interna ahora puede ser una de tres cosas: un local, un campo o un campo de una clase externa.

Un artefacto de esa complejidad es que la referencia oculta a la clase externa puede conducir a pérdidas de memoria. Digamos que la clase interna es un oyente y podría ser una clase interna estática. Mientras el oyente esté registrado, contiene una referencia a la instancia de la clase externa, que a su vez puede retener grandes cantidades de memoria. Hacer que el oyente sea estático puede permitir que la instancia externa se recoja.


Una clase interna no estática tiene una referencia implícita a la clase externa. Si haces la clase como estática, podrías guardar algo de memoria y código.


Una clase interna, por defecto, tiene una referencia implícita a un objeto de la clase externa. Si crea una instancia de un objeto de esto a partir del código de la clase externa, todo esto se hace por usted. Si lo hace de otra manera, debe proporcionar el objeto usted mismo.

Una clase interna estática no tiene esto.

Eso significa que puede ser instanciado fuera del alcance de un objeto de clase externa. También significa que si ''exporta'' una instancia de la clase interna, no impedirá que se recopile el objeto actual.

Como regla básica, si la clase interna no tiene ninguna razón para acceder a la externa, debería hacerlo estático por defecto.


Ya tenemos buenas respuestas, aquí están mis 5 centavos:

Tanto las clases internas estáticas como las no estáticas se utilizan cuando necesitamos separar las funciones lógicas y los métodos y las variables de la clase externa. Ambas clases internas tienen acceso a las variables privadas de la clase externa.

Ventajas de la clase interna estática: 1) las clases estáticas pueden acceder a las variables estáticas desde la clase externa 2) las clases estáticas pueden tratarse como una clase independiente

Clase interna no estática: 1) no puede usar miembros estáticos de la clase externa 2) no puede tratarse como una clase independiente

public class NestedClassDemo { private int a = 100; int b = 200; private static int c = 500; public NestedClassDemo() { TestInnerStatic teststat = new TestInnerStatic(); System.out.println("const of NestedClassDemo, a is:"+a+", b is:"+b+".."+teststat.teststat_a); } public String getTask1(){ return new TestInnerClass().getTask1(); } public String getTask2(){ return getTask1(); } class TestInnerClass{ int test_a = 10; TestInnerClass() { System.out.println("const of testinner private member of outerlcass"+a+"..."+c); } String getTask1(){ return "task1 from inner:"+test_a+","+a; } } static class TestInnerStatic{ int teststat_a = 20; public TestInnerStatic() { System.out.println("const of testinnerstat:"+teststat_a+" member of outer:"+c); } String getTask1stat(){ return "task1 from inner stat:"+teststat_a+","+c; } } public static void main(String[] args){ TestInnerStatic teststat = new TestInnerStatic(); System.out.println(teststat.teststat_a); NestedClassDemo nestdemo = new NestedClassDemo(); System.out.println(nestdemo.getTask1()+"...."+nestdemo.getTask2()); } }

Accediendo a la clase estática interna y no estática interna desde afuera:

public class TestClass { public static void main(String[] args){ NestedClassDemo.TestInnerClass a = new NestedClassDemo().new TestInnerClass(); NestedClassDemo.TestInnerStatic b = new NestedClassDemo.TestInnerStatic(); } }

El documento oficial de Java para la clase interna estática se puede encontrar en https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html