que privada nombre modificadores metodo llevan internas estaticas dentro clases clase anonimas acceso java private-members access-specifier public-members

nombre - ¿Por qué hacer público miembro de clase interna privada en Java?



modificadores de acceso java (6)

¿Cuál es la razón para declarar público a un miembro de una clase interna privada en Java si aún no se puede acceder fuera de la clase que contiene? ¿O puede?

public class DataStructure { // ... private class InnerEvenIterator { // ... public boolean hasNext() { // Why public? // ... } } }


Creo que falta la implementación de la parte de la interfaz Iterator en su código de muestra. En ese caso, no puede hacer que el método hasNext() tenga otro identificador de visibilidad que no sea público, ya que eso terminaría reduciendo su visibilidad (los métodos de interfaz tienen visibilidad pública) y no se compilará.


Es útil cuando implementas cualquier interface .

class DataStructure implements Iterable<DataStructure> { @Override public Iterator<DataStructure> iterator() { return new InnerEvenIterator(); } // ... private class InnerEvenIterator implements Iterator<DataStructure> { // ... public boolean hasNext() { // Why public? // ... return false; } @Override public DataStructure next() { throw new UnsupportedOperationException("Not supported yet."); } @Override public void remove() { throw new UnsupportedOperationException("Not supported yet."); } } public static void main(String[] ex) { DataStructure ds = new DataStructure(); Iterator<DataStructure> ids = ds.iterator(); ids.hasNext(); // accessable } }


Este método se puede hacer public para indicar que es semánticamente público, a pesar del hecho de que el compilador no impone reglas de visibilidad en este caso particular.

Imagina que durante una refactorización necesitas hacer que esta clase interna sea de alto nivel. Si este método es private , ¿cómo decidiría si se debería hacer public o si se debería usar algún modificador más restrictivo? Declarar el método como public le dice al lector las intenciones del autor original: este método no debe considerarse un detalle de implementación.


Hay muchas combinaciones de modificadores de acceso que no son útiles. Un método público en una clase interna privada solo es útil si implementa un método público en una clase / interfaz pública.

public class DataStructure { // ... private class InnerEvenIterator implements Iterator { // ... public boolean hasNext() { // Why public? // ... } } public Iterator iterator() { return new InnerEvenIterator(); } }

BTW: las clases abstractas a menudo tienen constructores public cuando en realidad están protected


Si la clase InnerEvenIterator no extiende ninguna clase ni implementa ninguna interfaz, creo que es una tontería porque ninguna otra clase puede acceder a ninguna instancia de la misma.

Sin embargo, si extiende o implementa cualquier otra clase o interfaz no privada, tiene sentido. Un ejemplo:

interface EvenIterator { public boolean hasNext(); } public class DataStructure { // ... private class InnerEvenIterator implements EvenIterator{ // ... public boolean hasNext() { // Why public? // ... } } InnerEvenIterator iterator; public EvenIterator getIterator(){ return iterator; } }


Si la clase interna es privada, no se puede acceder por su nombre fuera de la clase externa. Las clases internas y externas tienen acceso a los métodos privados de cada uno y a las variables de instancia privada. Mientras esté dentro de la clase interna o externa, los modificadores público y privado tienen el mismo efecto. En su ejemplo de código:

public class DataStructure { // ... private class InnerEvenIterator { // ... public boolean hasNext() { // Why public? // ... } } }

En lo que respecta a la clase DataStructure, esto es completamente equivalente a:

public class DataStructure { // ... private class InnerEvenIterator { // ... private boolean hasNext() { // ... } } }

Esto se debe a que solo DataStructure puede acceder a él, por lo que no importa si lo configura en público o privado. De cualquier manera, DataStructure sigue siendo la única clase que puede acceder a ella. Utilice el modificador que desee, no hace ninguna diferencia funcional. La única vez que no puede elegir al azar es cuando está implementando o extendiendo, en cuyo caso no puede reducir el acceso, pero puede aumentar. Entonces, si un método abstracto tiene acceso protegido, puede cambiarlo a público. Concedido ninguno de los dos realmente hace ninguna diferencia.

Si planeas usar una clase interna en otras clases, y por lo tanto hacerlo público, probablemente no debas convertirla en una clase interna en primer lugar.

Además, no veo ningún requisito para que las clases internas extiendan o implementen otras clases. Puede que sea común que lo hagan, pero ciertamente no es obligatorio.