Java中有没有类似Internal类的东西?

问题描述:

在C#中,您可以将一个类标记为internal,以便它只能从相同的包中访问。 Java中有没有类似的东西?Java中有没有类似Internal类的东西?

+3

http://*.com/questions/2534733/java-protected-classes – pintxo 2011-05-12 16:19:27

+2

@cmmi的可能重复:不是一个真正的重复,因为这个问题是从完全不同的角度问。虽然同样的答案。 – 2011-05-12 16:21:16

+4

请注意,C#没有'packages'-它们有'namespaces'和'assemblies'。包等同于名称空间。但是可以将组件与Java中的JAR文件进行比较。 'internal'修饰符使得一个类只能在程序集中访问。因此它与名称空间或包无关。 – nedR 2014-02-05 14:45:50

您可以通过从类的声明中省略安全修饰符(public,private)来创建包私有类。

package com.sample; 

class MyPackagePrivateClass 
{ 
    ... 
} 
+1

封装比组件更好的封装 – hB0 2013-10-22 18:57:46

+12

@ hB0:没办法!你会如何声明一个“内部”辅助类在不同的包中被引用?你简直不能 – Lotfi 2014-01-08 08:31:14

+1

我的意思是“更好的软件设计方式”不是更多的功能密集型(MS总是附带) – hB0 2014-01-08 15:00:31

删除访问修饰符与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; 
    } 
} 

来源:http://www.javacamp.org/javavscsharp/internal.html

+1

只有在类A,B,C,D在同一个包中时,它才会起作用。 而在C#中,它们只需位于同一个程序集中的相同命名空间 – User1234 2016-01-14 12:03:56

+6

@ User1234中,而不是名称空间。 – Roland 2016-03-14 18:11:54

是。这就是所谓的包私有的,你刚才定义的类不带任何修饰:

package com.blah; class Foo{ }

可以使类包本地。这是一个班级的默认范围。即您没有访问修饰符的地方。

如果你真的想放一些时间,你可以创建一个注释,例如@package_local,我在那些我希望它是本地包的地方执行此操作,而不是将它放在不明确的地方。

是的,默认(包私人)访问级别。只需在类定义中省略任何访问修饰符,即可获得所需的内容。

我不熟悉C#,但在Java中的默认保护的东西是只包中访问:

公共=被任何人访问

私人=仅在当前类

中访问

保护的封装内或在从当前类继承

默认=在包装内访问的任何类=访问

我一直认为应该有一种方法来说“可以从任何继承自当前类但不能从其他任何类访问的类,此包或任何其他类”。但没有。

+1

对于你最后的评论,C#有“受保护的内部” – projectshave 2015-09-01 13:47:40

+0

@projectshave nope它的错误。 C#中的“受保护的内部”也可以从您的程序集中访问。实际上是限制一个类的访问权仅限于C#中的其子类使用“protected”。而在java中,“protected”将可以从相同的包加上子类访问。 – 2016-11-06 06:56:28

这个问题有一个公认的答案之前,但我认为答案是不完全清楚一些谁是来自.Net新的Java的人。

Java是否有一些确切的等价物在C#中的内部修饰符?简短的回答是没有(但你可以实现它一些如何,我会告诉)!

C#中的内部实际上是一个“assembly-private”修饰符。什么是装配?

大会是项目的任何产品(在C#DLL或EXE - 相当于Java中可以有一个JAR文件)

没有在Java内部任何完全等效。实际上什么已经由Bryan凯尔回答,并接受为“包私人”(在Java包是等价的在C#中的命名空间),但一些怎么样已经有了答案是得到同样的结果最接近的方式。

可是如何才能让一个完全一样的结果内部?不能java有这个解决方案?答案是肯定的。

它确实有。但没有修饰符。 实际上,做这件事的最好方法是包装中的秘密。包装的最佳实践是按照他们的关系打包你的班级,而不是他们的班级。

我们很多人使用名为“模式”或“主持人”的包和把我们的所有型号,或主持人在其中。虽然这是该死的错误。包应该像Book一样,包含“BookModel.java”,“BookPresenter.java”,.....

这样你可以通过省略修饰符使它们成为package-private,并且没有任何问题,因为你可以访问他们在任何类需要你的包私人类,因为你有一个良好的打包习惯。