Java 如何创建一个类的对象-但是哪个类是不同的,并且取决于其他变量

Java 如何创建一个类的对象-但是哪个类是不同的,并且取决于其他变量,java,function,class,object,Java,Function,Class,Object,如果我想让我的程序创建一个类的对象,但选择哪个类还不确定。我该怎么办 代码: 将为您提供命名的类。然后将创建该类的对象 String choice = getChoice(i); Class<?> clazz = Class.forName(choice); Object object = clazz.newInstance(); 输出: 模拟器。TallMan@15db9742 模拟器。ShortMan@6d06d69c 将为您提供命名的类。然后将创建该类的对象 String c

如果我想让我的程序创建一个类的对象,但选择哪个类还不确定。我该怎么办

代码:

将为您提供命名的
。然后将创建该类的对象

String choice = getChoice(i);
Class<?> clazz = Class.forName(choice);
Object object = clazz.newInstance();
输出:

模拟器。TallMan@15db9742
模拟器。ShortMan@6d06d69c

将为您提供命名的
。然后将创建该类的对象

String choice = getChoice(i);
Class<?> clazz = Class.forName(choice);
Object object = clazz.newInstance();
输出:

模拟器。TallMan@15db9742
模拟器。ShortMan@6d06d69c


现在是你定义一个架构的时候了,如果这个方法可以返回不同的类,我可以推断这些类在某种程度上是相关的,并且在它们可以做什么或者它们是什么方面有一些共同点

然后,您可以准备课程可以做什么:

public interface ISomethingInCommon{
    void something();
}

private ISomethingInCommon getChoice(int ID) {
    swith(){
    case 0:
        return new FooA();
    case 1:
        return new FooB();
    defult:
        return new FooDefault();
}

为了有效FooAFooBFooDefault必须实现等距通用

定义体系结构的时间,如果该方法可以返回不同的类,我可以推断这些类在某种程度上是相关的,并且在它们可以做什么或它们是什么方面有一些共同点

然后,您可以准备课程可以做什么:

public interface ISomethingInCommon{
    void something();
}

private ISomethingInCommon getChoice(int ID) {
    swith(){
    case 0:
        return new FooA();
    case 1:
        return new FooB();
    defult:
        return new FooDefault();
}

为了有效FooAFooBFooDefault必须实现ISomethingInCommon

,这绝对是个糟糕的设计。如果你解释一下你想用这个实现什么,我们可以为你提供一个很好的解决方案。我正在创建一个2d模拟器。for循环是主要方法中的第一个,将对象添加到模拟中。这绝对是一个糟糕的设计。如果你解释一下你想用这个实现什么,我们可以为你提供一个很好的解决方案。我正在创建一个2d模拟器。for循环是主方法中的第一个,向模拟中添加对象。您好,谢谢您的回答。所有可能的课程都提前知道了,所以我想我会选择你的第二个选择。但是,我不确定以下内容的含义(ofc“private static”除外):Class Class_BY_ID[]={Class10.Class,…}
Class_BY_ID[]={…}
Class
类型数组的内联声明和初始化。
{…}
中的内容是数组的值。由于我们从不更改数组,并且没有其他人需要访问它,因此当然应该将其声明为
private final static
{Class10.class,Class11.class,Class12.class}
将初始化数组,以便
class\u BY\u ID[0]
Class10.class
class\u BY\u ID[1]
Class11.class
,等等。它现在似乎可以工作了,只是我得到了“类型不匹配,无法从类转换到类”课程顺序是单位->人->矮人/塔尔曼我的坏。似乎您必须在数组声明中使用
Class
,然后在从
getChoice()
返回之前强制转换该类。我已经更新了我的答案。我明白了,这似乎可以做到这一点。然而,obj.add(newgetchoice(id)(w,id));现在不行,谢谢你的回答。所有可能的课程都提前知道了,所以我想我会选择你的第二个选择。但是,我不确定以下内容的含义(ofc“private static”除外):Class Class_BY_ID[]={Class10.Class,…}
Class_BY_ID[]={…}
Class
类型数组的内联声明和初始化。
{…}
中的内容是数组的值。由于我们从不更改数组,并且没有其他人需要访问它,因此当然应该将其声明为
private final static
{Class10.class,Class11.class,Class12.class}
将初始化数组,以便
class\u BY\u ID[0]
Class10.class
class\u BY\u ID[1]
Class11.class
,等等。它现在似乎可以工作了,只是我得到了“类型不匹配,无法从类转换到类”课程顺序是单位->人->矮人/塔尔曼我的坏。似乎您必须在数组声明中使用
Class
,然后在从
getChoice()
返回之前强制转换该类。我已经更新了我的答案。我明白了,这似乎可以做到这一点。然而,obj.add(newgetchoice(id)(w,id));现在不行
package simulator;

import java.lang.reflect.*;
import java.util.*;

public class Simulator {

    public static void main(String... args)
            throws InstantiationException, IllegalAccessException, NoSuchMethodException,
            SecurityException, IllegalArgumentException, InvocationTargetException {
        for (int i = 0; i < 2; i++) {
            Class<? extends Unit> unit_class = getChoice(i);
            Constructor<? extends Unit> constructor = unit_class.getConstructor(String.class);
            Unit unit = constructor.newInstance("Name");
            System.out.println(unit);
        }
    }

    private final static List<Class<? extends Unit>> UNIT_BY_ID = Arrays.asList(TallMan.class,
            ShortMan.class);

    private static Class<? extends Unit> getChoice(int id) {
        return UNIT_BY_ID.get(id);
    }
}

class Unit {
    Unit(String name) {
    }
}

class Man extends Unit {
    Man(String name) {
        super(name);
    }
}

class TallMan extends Man {
    public TallMan(String name) {
        super(name);
    }
}

class ShortMan extends Man {
    public ShortMan(String name) {
        super(name);
    }
}
public interface ISomethingInCommon{
    void something();
}

private ISomethingInCommon getChoice(int ID) {
    swith(){
    case 0:
        return new FooA();
    case 1:
        return new FooB();
    defult:
        return new FooDefault();
}