1

如何防止在 Java 中使用默认构造函数?

在我的评估中,它说:

"We don't want the user to use the default constructor since the user has to specify the HashCode, and maximum load factor"

我认为这可以解决问题,但显然不是(字典是一个用于抛出异常的类):

public boolean HashDictionary() throws DictionaryException {}

字典异常类:

public class DictionaryException extends Throwable {

}

测试以确保它在使用默认构造函数时抛出异常(由讲师提供):

try
{
    HashDictionary h = new HashDictionary();
    System.out.println("***Test 1 failed");

}
catch (DictionaryException e) {
        System.out.println("   Test 1 succeeded");
}

我只想知道如何做到这一点,因为我不熟悉这样做的方法。谢谢。

4

7 回答 7

5

如果您不希望调用默认值,可以将其声明为私有。

要回答您的评论,您可以抛出异常-

public HashDictionary() throws DictionaryException {
    throw new DictionaryException("Default constructor is not allowed.");
}
于 2013-10-21T14:32:12.783 回答
3

你可以

a) 省略默认构造函数

b) 将默认构造函数设为私有

c) 使用默认构造函数时抛出异常

public HashDictionary() throws DictionaryException {
    throw new DictionaryException("Default constructor should not be used!");
}
于 2013-10-21T14:34:16.517 回答
1

不要那样做。只需将默认构造函数设为私有:

private HashDictionary() {}

编辑:boolean构造函数定义中做了什么?我只是复制它...

于 2013-10-21T14:33:30.593 回答
0

如果您不希望用户使用默认构造函数,则可以在声明其他非默认构造函数时省略该构造函数,或者您可以创建默认构造函数private

您可能遇到的另一个问题是您在问题中提出的声明不是构造函数,而是一种方法。构造函数没有返回类型。

改变这个

public boolean HashDictionary() throws DictionaryException {}

对此

public HashDictionary() throws DictionaryException {}

更好的是只需将其更改为

private HashDictionary() {}

然后没有人可以在类本身之外访问它。

于 2013-10-21T14:36:24.900 回答
0

我最终添加了这个:

 public DictionaryException(String error_string)
 {
     System.out.println(error_string);
 }

作为 DictionaryException 的默认构造函数

接着:

public HashDictionary() throws DictionaryException {
    throw new DictionaryException("Default constructor should not be used!");
}

这对于 HashDictionary 的默认构造函数,问题是类型是布尔值,所以我删除了它,它似乎工作。

于 2013-10-21T15:00:16.407 回答
0
  1. 要禁止从类外部调用默认构造函数,请使用:

    私有 HashDictionary(){}

  2. 要禁止从类内部调用默认构造函数,请使用:

    声明一个参数化的构造函数,不要在类内部编写默认的非参数化构造函数。公共哈希字典(字符串字符串){}

  3. 如果你想在调用构造函数时抛出一些异常,那么:

    public HashDictionary() throws Exception {
    throw new Exception("从构造函数抛出异常");
    }

问候,比兰德拉。

于 2013-10-21T15:15:35.073 回答
0

如果您不想使用默认构造函数,但想实例化一个类,则需要实现自定义构造函数。您必须告诉用户创建有效实例需要什么。就是这样!默认构造函数将不再可用。如果构造函数逻辑太复杂,请随意提取私有方法,包括私有构造函数,如果您觉得可以的话。如果您有多种创建实例的方法,则可以使用静态工厂类方法和私有 ctor。制作一个私人 ctor 只是为了禁用默认的 ctor 是没有意义的(至少我没有看到)。

如果您不想实例化一个类(我的意思是您不想使用默认 ctor 并且您没有理由创建自定义 ctor),这意味着您只想使用静态字段/方法,所以让整个类静态.

哦,我假设我们在谈论非抽象类。

于 2013-10-25T09:22:54.397 回答