-1

我们通过将类声明为抽象类或使用私有构造函数或任何方法来限制用户创建类的对象
但我的疑问是如何阻止用户甚至创建类的引用
例如:

 class emp
{
    int eno;
}
 class Test
{


    public static void main(String[] args)
    {
        emp e;//here User shud not be allowed to create an reference 

    }

}  
4

5 回答 5

3

如果您不希望从其他包访问该类,您可以声明它省略public关键字。

所以,而不是将其声明为

public class Test{
  //...
}

你可以使用:

class Test{
  //...
}

这样只有同一个包内的类才能访问它。有关详细信息,请参阅控制对类成员的访问

这将避免其他类(包外)引用Test,但不会阻止Test在同一个包中实例化。如果要防止实例化,请创建一个私有构造函数,正如其他人已经说过的那样。

于 2013-07-15T18:25:01.810 回答
1

如何阻止用户甚至创建一个类的实例

不知道您将对该类做什么,但您可以通过将构造函数标记为私有来防止用户不创建您的类的实例。

于 2013-07-15T18:15:22.977 回答
0

你为什么要这样做?首先让我们看看何时以及如何创建类实例。- 通常 ClassLoader 加载并创建类 Instance。因此,每个 ClassLoader 层次结构/每个 JVM 创建一次 Class Instance。但是用户可以自由地编写自己的 ClassLoader 加载和创建 Class Objects。因此,您的目的再次没有实现。

您可能只能限制用户使用类实例。1.私有内部/嵌套类。这些类在 The Outer 类之外是不可见的。

有一种方法可以实际限制类实例的创建 ** 但它的方法很糟糕 ** *在类静态初始化程序中引发运行时异常 *

例子

//Please don't try at home :)
private static class UnloadableClazz {
        static {
            if(true){
                throw new RuntimeException();
            }
        }

        public static String data = "data-value";
    }
于 2013-07-15T18:38:47.297 回答
0

制作私有构造函数不会解决问题。

你可以提供一个public static方法 saygetInstance()然后从那里你可以像这样返回类的实例。

public class Emp{
    private Emp(){
    }
    /*Constructor private? No worries. 
      We can still create an instance using a public static method. 
      Just call Emp.getInstance().*/
    public static Emp getInstance(){
        return new Emp();
    }
}

您必须将课程设置为abstract

public abstract class Emp{
     //Method implementations 
}

这将不允许使用它自己的构造函数来创建类的实例。但是,我们可以使用派生类构造函数创建此类的实例。

于 2013-07-15T18:27:55.423 回答
0

将构造函数设为私有。参考下面的代码

 class emp
{
    int eno;

    private emp(){}
}
于 2013-07-15T18:18:52.927 回答