当前位置: 首页 > 面试题库 >

使用私有构造函数扩展类

西门洛城
2023-03-14
问题内容

假设我们有以下代码:

class Test {
    private Test() {
        System.out.println("test");
    }

}

public class One extends Test {

    One() {
        System.out.println("One");
    }

    public static void main(String args[]) {

        new One();
    }
}

当我们创建一个对象时One,该对象最初称为父类构造函数Test()。但是就像Test()私人的一样-
我们收到一个错误。一个好的例子和解决这个问题的方法是多少?


问题答案:

没有出路。你必须创建一个可用的(protectedpublic或默认)的超级构造函数能够延长test

这种表示法通常用于实用程序类或单例中,在这种情况下,您不希望用户通过扩展实例和实例化子类,或者只是通过调用类的构造函数来自己创建类的实例。

当您只有一个class具有private构造函数的时,您也可以将更class改为,final因为它根本无法扩展。

另一个解决方案是使用一种方法,在test其中创建的实例test并将每个方法调用委托Onetest实例。这样,您不必扩展test

class Test {
    private Test() {
        System.out.println("test");
    }
    public static Test getInstance(){
        return new Test();
    }
    public void methodA(){
        //Some kind of implementation
    }
}

public class One {
    private final Test test;
    One() {
        System.out.println("One");
        test = Test.getInstance();
    }

    public void methodA(){
        test.methodA();
    }

    public static void main(String args[]) {
        new One();
    }
}


 类似资料:
  • 在Scala中,如何使用trait中定义的私有构造函数参数扩展类中的trait? 上面的类给出了一个错误: 类子级需要是抽象的,因为方法名位于类型的trait父级中⇒ 未定义字符串。 当然-我当然可以: 使类抽象, 在构造函数中定义它而不使用私有,例如。 使父类成为而不是trait 但是,使用上述实现,在扩展trait时,我不可能拥有私有构造函数参数吗?注意,我希望变量是私有的,这样我就不能执行c

  • 问题内容: 嘿 语言是Java。我想扩展构造函数具有参数的此类。 这是主要的课程 这是儿童班 如何编写正确的语法?并且错误是“构造函数无法应用于给定类型” 问题答案: 您可以定义构造函数所需的任何参数,但是有必要将超类的一个构造函数作为自己的构造函数的第一行来调用。可以使用或来完成。

  • 我有一个带有私有构造函数的单例类,我想为此编写单元测试。 如何使用mockito框架模拟具有私有构造函数的类。 谢谢

  • 我使用的是C(Qt)。 我正在扩展一个单例类,而一个子类只有静态方法。我没有创建子类的任何实例。Singleton类的构造函数和析构函数都是私有的,所以我不能访问它的构造函数和析构函数。 我使用子类::getInstance()调用父类的getInstance()。我只使用子类的静态方法(因此不需要实例化子类)。 所以我的问题是,我在编译时收到警告- "子类:由于基类析构函数不可访问,无法生成析构

  • 问题内容: 为什么将只有私有构造函数的类标记为final是一个好习惯?我的猜测是,要让其他程序员知道它不能被子类化。 问题答案: 将类定为final具有一些(小的)性能提升,因为JIT编译器可以内联该类的功能。我不知道这是否符合“良好做法”的要求,但是我看到了好处。

  • 我有一个java类,它只有静态方法和字段,所以我不想为此创建任何对象。我可以从两个方面来理解, 创建类摘要 使用私有构造函数。 这两种方法哪一种更好?