当前位置: 首页 > 知识库问答 >
问题:

如何在构造函数中创建给定类型的新对象

滕弘新
2023-03-14

我在弄清楚如何根据给定的类型在构造函数中创建一个新对象时遇到了困难。

例如,我有一个机器人驱动程序,它有一个默认构造函数,不接受任何参数,并创建一个基本的机器人。但我有另一个构造器,根据这个论点创造了一个新的机器人。

public RobotDriver() {
   this.robot = new BasicRobot();
}

public RobotDriver(Robot robot) {
  //don't know what to do here...
}

Robot是一个接口。那么,如果我想创建机器人驱动程序,使其机器人是另一种类型,比如高级机器人?我需要做一些类型的铸造吗?

共有3个答案

公孙志尚
2023-03-14

为此,可以扩展Robot类并创建一个名为AdvancedRobot的新类。然后可以使用多态性http://www.tutorialspoint.com/java/java_polymorphism.htm.理想情况下,您可以在新创建的AdvancedRobot类中创建逻辑来封装AdvancedRobot。如果设置正确,则无需进行铸造。

柯宜年
2023-03-14

如果只想捕获构造函数参数,可以使用:

public RobotDriver(Robot robot) {
    this.robot = robot;
}

如果要在构造函数中创建参数的副本,有几种可能性。如果你的Robot实现都有一个默认构造函数,你可以这样做:

public RobotDriver(Robot robot) {
    this.robot = robot.getClass().newInstance();
}

否则,您可能会修改Robot界面以包含复制功能

public RobotDriver(Robot robot) {
    this.robot = robot.makeCopy();
}

或者,您可以将RobotaCloneable类,并修改Robot接口,使clone()公开(默认情况下,它受保护):

public RobotDriver(Robot robot) {
    this.robot = robot.clone();
}

(这基本上是另一个版本的makeCopy()

最后,应用Juned Ahsan的答案,您可以定义机器人驱动程序构造函数,将工厂作为参数,或者,对于默认构造函数,具有可设置的静态默认工厂:

public class RobotDriver {
    // basic robots by default
    private static RobotFactory defaultFactory = new BasicRobotFactory();
    private static RobotFactory factory = defaultFactory;

    public RobotDriver() {
        robot = factory.makeRobot();
    }

    /**
     * Change the factory for new instances of RobotDriver
     */
    public static void setFactory(RobotFactory factory) {
        this.factory = factory == null ? defaultFactory : factory;
    }
}
韦望
2023-03-14

也许你正在寻找一个可以创建任何机器人类型的对象的类:机器人驱动程序/高级机器人等。如果是,那么你需要研究工厂设计模式。

来自维基百科的工厂模式

工厂方法模式是一种创造性模式,它使用工厂方法来处理创建对象的问题,而不指定要创建的对象的确切类别。这是通过调用在接口中指定并由子类实现的工厂方法,或在基类中实现并可选地由派生类重写的工厂方法来创建对象的,而不是通过调用构造函数。

 类似资料:
  • 问题内容: 我想创建一个KeyValue类,但以通用方式,这就是我写的内容: 错误显示:“令牌“>上的语法错误”,此令牌后应有标识符” 那我该如何在Java中创建一个通用构造函数呢? 问题答案: 您需要从构造函数的签名中删除:它已经隐式存在。

  • 写一个名为Circle的类。该类需要一个名为radius的类型为double的字段(实例变量) 该类需要有一个参数半径为double类型的构造函数,并且需要初始化字段。 如果半径参数小于0,则需要将半径字段值设置为0。 编写以下方法(实例方法): 方法名为getRadius,没有任何参数,需要返回半径字段的值。 名为getArea的方法,没有任何参数,需要返回计算的面积(半径*半径*PI)。对于P

  • 我正在从一个教程中重构下面的代码。当我< s >运行编译它时,我得到以下错误: Vierbeiner类中的构造函数Vierbeiner不能应用于给定类型;必需:java.lang.找到字符串:无参数原因:实际参数列表和正式参数列表长度不同 我的理解是,发生这个错误是因为父类Vierbeiner有一个需要字符串参数的构造函数,而没有一个不需要参数的构造函数。我不明白的是,为什么我在没有创建Hund类

  •  · · · >以下文章解释了为什么在使用第二种方法时需要小心:https://mayaposch.wordpress.com/2011/11/01/how-to-realt-realt-use-qthreads-the-full-explanation/  · · · >下面的文章解释了为什么这两种方法都有各自的优点:https://woboq.com/blog/qthread-you-were

  • 我想有一个java中的构造函数参数化一个类来运行这个类,类似于这个 其中classToRun可能的类没有共同的祖先,但都有方法someStaticMethod。 但也存在一些问题,比如内部类不能有静态方法,类不能被转换为类,等等。 有一些用类方法参数化的解决方案,如 如何在Java中传递类作为参数? 在java中将类作为参数传递给方法 但对建造者来说不是。 这样做的正确解决方案是什么?

  • 我得到了下面的代码,使用数组来查找一些prim数。然而,当试图编译我的用户类PalindromeArrayUser时,它说——“类中的构造函数不能应用于给定的类型” 要求:int。找到:没有论点。原因:实际参数和正式参数列表的长度不同。 但是,我已经向构造器传递了一个int值(与我的蓝图中设计的方式相同)。我不太明白问题来自哪里。谢谢。 这是我的两节课 而这就是我的用户类问题的来源。上面的类编译良