我试图在我的项目中做一些事情但是很难解释所以我想到了一个例子。假设您有一个名为studentArray的字符串学生名称数组。现在你有一个名为Student(String name)的类。现在在您的Attendance类中,您有一个方法,您想要加载学生对象的ArrayList;让我们调用这个ArrayList classRoom。但是你必须首先创建这些Student对象,你可以通过Student(任意名称)= new Student(); 。现在,您希望将这些Student对象的引用名称作为随机字符串加载到名为randomStrings的数组中。现在:
for(int i =0; i<=studentArray.size(); i++)
{
Student (arbitrary name) = new Student(studentArray[i]);
classRoom.add(THE STUDENT THAT WAS JUST CREATED);
}
现在我想使用任意名称作为randomStrings [i]。但我想知道,在java中这样的事情是可能的吗?我该怎么做呢?
Student randomStrings[i] = new Student(studentArray[i]);
不是他们让我这么做的。我希望你们能理解我的榜样,因为我不知道如何说明它。
P.S。
像:
Student letter0 = new Student(studentArray[i]); //letter0 is the string in randomString array
Student letter1 = new Student(studentArray[i+1]); //letter1 is the string in randomString array
Student letter2 = new Student(studentArray[i+2]); //letter2 is the string in randomString array
Student letter3 = new Student(studentArray[i+3]); //letter3 is the string in randomString array
而不是完成所有这些,我只想从数组randomString中提取名称,让循环为我自己创建Student对象,而无需我手动执行。我希望它更清楚。
答案 0 :(得分:2)
这是你真正想要做的事情:
classRoom.add(new Student(studentArray[i]));
然后确保你可以做相反的事情:
classRoom.getStudentByName(final String name);
你在哪里:
public class ClassRoom
{
private final Map<String, Student> students = new HashMap<String, Student>();
public void add(final Student s) { this.students.put(s.getName(), s); }
public Student getStudentByName(final String n) { return this.students.get(n); }
}
您可以在此Map
个实例中存储/检索您的学生。
允许这样做的语言证明了这里没有尝试动态创建名称引用的正当理由,因此无法通过查看静态代码来调试和推断何时动态创建事物。
metadata
编程。您可以以编程方式将数据和函数成员添加到对象中 两种语言,在极端特定的极限情况下这样做 适度可以是强大而优雅的。
滥用它会造成难以理解的难以理解的混乱 通过阅读代码来理解或推理,它需要一个 强大的功能丰富的步骤调试器和一个非常耐心的人 尝试使用代码。
现在想象一下,如果可以在本地范围内创建命名变量 willy nilly它会完全混乱,完全不确定 一个人阅读代码。
在我使用Java的17年中,我已经看到许多误入歧途的尝试做你想做的事情,可能是因为同样的原因,天真和缺乏实践知识和经验,它们都是维护者的噩梦场景。作为聘请的顾问,我赚了很多钱来解决已经造成的混乱局面。这是不解决任何问题的解决方案,如果它几乎所有语言都支持它,而不是。
一个这样的解决方案生成了源代码,将其写入文件系统,然后编译并使用自定义类加载器将生成的字节码加载回来,整个系统感染了这个混乱,这是反射滥用的噩梦同样,它确实是一个最极端的灾难性WTF。
答案 1 :(得分:1)
据我所知,你想要一些存储在数组中的字符串,并将它们用作类的变量名,即变量的标识符。我不认为这是可能的,因为标识符不是类对象,它是一个令牌,您必须手动命名您的标识符或使用任何数据结构。如果它是顺序的,如示例中所示,您可以使用arraylist。
答案 2 :(得分:0)
您可以使用地图来执行此操作。
Map<String, Student> students = new HashMap<String, Student>();
students.put("Enrique", new Student("Enrique"));
OR
Map<String, Student> students = new HashMap<String, Student>();
for(String randomString : randomStrings){
students.put(randomString, new Student(randomString));
}
然后使用
doSomethingWithAStudent(students.get("Enriqué"));
但从Map
访问比直接访问变量要慢,在某些情况下可能有点笨拙。不要只是因为你不想写变量。
答案 3 :(得分:0)
你太努力了。您所需要的只是:
for (int i = 0; i <= studentArray.size(); i++) {
Student student = new Student(studentArray[i]);
classRoom.add( student );
}
不需要为每个学生使用不同的局部变量。在这种情况下,每次进行循环时都会重新创建student
变量,因此每次都会有所不同。即使你在循环之外声明它,它每次都会重新初始化,所以它也可以正常工作。你可以将其重写为:
for (int i = 0; i <= studentArray.size(); i++)
classRoom.add( new Student( studentArray[i] );
虽然你可能想要坚持第一种方式,直到你掌握它。
通常,如果您发现自己创建了一系列名称为x1,x2,x3,....,xn的变量,则需要将这些值直接放入数组或集合或其他内容中。