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();
}
为了有效FooA,FooB和FooDefault必须实现等距通用定义体系结构的时间,如果该方法可以返回不同的类,我可以推断这些类在某种程度上是相关的,并且在它们可以做什么或它们是什么方面有一些共同点 然后,您可以准备课程可以做什么:
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();
}
为了有效FooA,FooB和FooDefault必须实现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();
}