如何防止在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 {}
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");
}
我只是想知道如何做到这一点,因为我不熟悉这样做的方法。感谢。
答案 0 :(得分:4)
如果您不希望调用它,可以将默认声明声明为私有。
要回答您的评论,您可以抛出异常 -
public HashDictionary() throws DictionaryException {
throw new DictionaryException("Default constructor is not allowed.");
}
答案 1 :(得分:2)
你可以
a)省略默认构造函数
b)将默认构造函数设为私有
c)使用默认构造函数时抛出异常
public HashDictionary() throws DictionaryException {
throw new DictionaryException("Default constructor should not be used!");
}
答案 2 :(得分:1)
不要那样做。只需将默认构造函数设为私有:
private HashDictionary() {}
编辑:构造函数定义中boolean
做了什么?我刚刚复制了它......
答案 3 :(得分:0)
如果您不希望用户使用默认构造函数,您可以省略构造函数,如果声明了其他非默认构造函数,或者您可以创建默认构造函数private
。
您可能遇到的另一个问题是您在问题中提出的声明不是构造函数,而是一种方法。构造函数没有返回类型。
更改此
public boolean HashDictionary() throws DictionaryException {}
到这个
public HashDictionary() throws DictionaryException {}
更好,只需将其更改为
private HashDictionary() {}
然后没有人可以在课堂外访问它。
答案 4 :(得分: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的默认构造函数,问题是该类型是一个布尔值,所以我删除了它,它似乎工作。
答案 5 :(得分:0)
要禁止从外部类调用默认构造函数,请使用:
private HashDictionary(){}
要禁止从内部类中调用默认构造函数,请使用:
声明参数化构造函数,不要在类中编写默认的非参数化构造函数。 public HashDictionary(String string){ }
如果你想在调用构造函数时抛出一些异常,那么:
public HashDictionary()抛出异常{
抛出新的异常(“从构造函数中抛出异常”);
}
此致,比兰德拉。
答案 6 :(得分:0)
如果您不想使用默认构造函数但想要实例化类,则需要实现自定义构造函数。您必须告诉用户创建有效实例需要什么。就是这样!默认构造函数将不再可用。如果构造函数逻辑太复杂,可以随意提取私有方法,包括私有构造函数,如果你觉得它在你的情况下是好的。如果您有许多创建实例的方法,可以使用类似静态工厂的方法和私有ctor。 使私有ctor只禁用默认值是没有意义的(至少我没有看到)。
如果你不想实例化一个类(我的意思是你不想使用默认的ctor而你没有理由创建一个自定义ctor),这意味着你只想使用静态字段/方法,所以make全班静态。
哦,我认为我们谈论的是非抽象类。