【问题标题】:Throw exception for default constructor java抛出默认构造函数java的异常
【发布时间】:2013-10-21 14:30:54
【问题描述】:

如何防止在 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");
}

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

【问题讨论】:

    标签: java class oop constructor


    【解决方案1】:

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

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

    public HashDictionary() throws DictionaryException {
        throw new DictionaryException("Default constructor is not allowed.");
    }
    

    【讨论】:

    • 这是更好的答案,因为它会在编译时停止。
    • 这个想法是它运行并抛出错误以向讲师展示所有测试都已通过。由于第一个测试是看是否可以使用默认构造函数,如果我无法通过此测试,那么我无法进行其他测试。
    • @ConnerStephenMcCabe 你可以抛出异常。编辑了我的答案。
    【解决方案2】:

    你可以

    a) 省略默认构造函数

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

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

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

    【讨论】:

    • 这似乎是最好的方法,但是一旦默认构造函数设置为私有,它就永远不会编译代码。我需要它来编译,如果使用没有参数的默认构造函数就抛出一个异常。
    • 那么默认构造函数必须存在,但只是为了抛出异常。这意味着选项 C 是要走的路
    • 我尝试了这个方法,但是它本身给了我一个错误,它指出在try语句的相应主体中永远不会抛出异常。
    • 哦..我明白了..我的代码有一个错误,它是“公共布尔值”,所以它不是构造函数,而是一个方法。更新了我的答案
    【解决方案3】:

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

    private HashDictionary() {}
    

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

    【讨论】:

    • @SotiriosDelimanolis 你指出这一点很有趣,因为你回答了同样的错误 ;-)
    • @MateuszDymczyk 我的回答与构造函数无关。它更多地与throws 声明有关。
    • 这个方法简单的抛出编译错误,程序需要尝试一下,如果不行就抛出异常。
    • @ConnerStephenMcCabe 为什么有人更喜欢运行时而不是编译时错误?
    【解决方案4】:

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

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

    改变这个

    public boolean HashDictionary() throws DictionaryException {}
    

    到这里

    public HashDictionary() throws DictionaryException {}
    

    更好,但只需将其更改为

    private HashDictionary() {}
    

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

    【讨论】:

      【解决方案5】:

      我最终添加了这个:

       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 的默认构造函数,问题是类型是布尔值,所以我删除了它,它似乎可以工作。

      【讨论】:

        【解决方案6】:
        1. 要禁止从外部类调用默认构造函数,请使用:

          私有 HashDictionary(){}

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

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

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

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

        问候,比兰德拉。

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-10
            • 2011-11-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-28
            • 2014-11-03
            • 1970-01-01
            相关资源
            最近更新 更多