2011-05-12 18 views
33

En C#, puede marcar una clase como internal para que solo sea accesible desde el mismo paquete. ¿Hay algo similar en Java?¿Hay algo así como una clase interna en Java?

+3

Posible duplicado de http://stackoverflow.com/questions/2534733/java-protected-classes – pintxo

+2

@cmmi: Realmente no es un duplicado, ya que la pregunta se realiza desde una perspectiva completamente diferente. La misma respuesta sin embargo. –

+4

Tenga en cuenta que C# no tiene 'packages'- Tienen' namespaces' y 'assemblies'. Los paquetes son equivalentes a los espacios de nombres. Pero los ensamblajes se pueden comparar con los archivos JAR en Java. El modificador 'interno' hace que una clase solo sea accesible dentro de un ensamblaje. Como tal, no tiene nada que ver con espacios de nombres o paquetes. El paquete – nedR

Respuesta

47

Puede crear clases del paquete y el privado por omitir el modificador de la seguridad (pública y privada) de la declaración de la clase.

package com.sample; 

class MyPackagePrivateClass 
{ 
    ... 
} 
+1

es mucho mejor que el ensamblaje – hB0

+12

@ hB0: ¡De ninguna manera! ¿Cómo declararías una clase de ayudante "interna" en diferentes paquetes? Simplemente no puede – Lotfi

+1

Lo que quise decir es "una mejor forma de diseño de software" no intensivo en funciones (que MS siempre viene) – hB0

6

Dejando caer el modificador de acceso es similar a la interna en C#.

C#

public class A 
{ 
    public static int X; 
    internal static int Y; 
    private static int Z; 
} 
internal class B 
{ 
    public static int X; 
    internal static int Y; 
    private static int Z; 
    public class C 
    { 
     public static int X; 
     internal static int Y; 
     private static int Z; 
    } 
    private class D 
    { 
     public static int X; 
     internal static int Y; 
     private static int Z; 
    } 
} 

Java

public class A 
{ 
    public static int X; 
    static int Y; 
    private static int Z; 
} 
class B 
{ 
    public static int X; 
    static int Y; 
    private static int Z; 
    public class C 
    { 
     public static int X; 
     static int Y; 
     private static int Z; 
    } 
    private class D 
    { 
     public static int X; 
     static int Y; 
     private static int Z; 
    } 
} 

Fuente: http://www.javacamp.org/javavscsharp/internal.html

+1

Eso funcionará SÓLO si las clases A, B, C, D están en el mismo paquete. Mientras están en C# solo tienen que estar en el mismo espacio de nombres, – User1234

+6

@ User1234 en el mismo ensamblado, no en el espacio de nombres. – Roland

1

Sí. Se llama paquete privado, que acaba de definir la clase sin ningún modificador:

package com.blah; class Foo{ }

0

Puede hacer un paquete de clase local. Este es el alcance predeterminado para una clase. es decir, donde no tiene modificadores de acceso.

Si realmente quiere poner en algún momento se puede crear una anotación por ejemplo, @package_local, hago esto en lugares donde esperemos que sea un paquete local y no lo deje sin especificar.

0

Sí, el nivel de acceso (privado paquete) por defecto. Simplemente omita cualquier modificador de acceso en la definición de su clase y obtendrá lo que desea.

1

No estoy familiarizado con C#, pero en Java la protección por defecto es que algo es sólo accesible dentro del paquete:

pública = accesible por cualquier persona

privada = accesible sólo dentro de la clase actual

protegida = accesible dentro de un envase o en cualquier clase que hereda de la clase actual

defecto = accesible dentro del paquete

Siempre he pensado que debería haber una manera de decir "accesible por cualquier clase que herede de la clase actual pero no desde ningún otro lugar, este paquete o cualquier otro". Pero no hay.

+1

Para su último comentario, C# tiene "protección interna" – projectshave

+0

@projectshave no está mal. También se puede acceder a "protegido interno" en C# desde todo su ensamblaje. en realidad, para limitar el acceso de una clase solo a sus subclases en el uso de J # C "protegido". mientras que en java "protegido" se podrá acceder desde el mismo paquete más a las subclases. –

2

esta pregunta tiene una respuesta aceptada antes, pero creo que la respuesta no es totalmente claro para alguien que es nuevo en java que viene de .Net.

¿Se Java tienen algún equivalente exacto para modificador interno en C#? la respuesta corta es NO (pero puede lograrlo de alguna manera y lo diré) !!

interna en C# es en realidad un modificador de "montaje-privada". ¿Qué es una asamblea?

Asamblea es cualquier producto de su proyecto (DLL o EXE en C# - equivalente en Java puede ser un archivo JAR)

no hay ningún equivalente exacto para uso en interior en Java. y lo que ha sido respondido por Bryan Kyle y aceptado es en realidad "paquete privado" (los paquetes en Java son equivalentes para los espacios de nombres en C#) pero de alguna manera lo que se ha respondido es la forma más cercana de obtener el mismo resultado.

PERO, ¿cómo obtener el mismo resultado que el interno? ¿No puede Java tener una solución para esto? la respuesta es sí.

tiene. pero no con un modificador. En realidad, la mejor manera de hacerlo es un secreto en el embalaje. la mejor práctica de empacar es empacar sus clases por su relación, no por su tipo.

muchos de nosotros usamos paquetes llamados "Modelos" o "Presentadores" y ponemos todos nuestros modelos o presentadores en ellos. mientras esto es tan malditamente incorrecto los paquetes deben ser como "Libro" que contiene "BookModel.java", "BookPresenter.java", .....

de esta manera puede hacer que sean paquetes privados al omitir el modificador y no tener ningún problema porque puede acceda a ellos en cualquier clase que necesite su clase privada de paquete porque tiene una buena práctica de empaquetado.

Cuestiones relacionadas