简而言之:
在启动Java / Android应用程序时,请考虑使用硬编码值初始化的数据数组。然后,在运行时,类可以从该数据中读取。它想要访问的数组中的确切元素取决于运行时的用户输入。
详细说明:
考虑一个填字游戏应用程序。在主屏幕中,选择要播放的填字游戏。填字游戏(类),创建多个问题(类)。要创建一个问题,它会用两个字符串初始化:'question'和'answer'。为了让填字游戏能够创建所有问题,它需要知道哪些问题属于它。当用户从列表中选择填字游戏时,它会传递一个ID,该ID将映射到(可能)多维数组的元素索引,其中每个外部数组代表一组填字游戏问题,每个内部数组代表其中的问题填字游戏。与下面类似:
Array(
// crossword 1
[0] => Array(
// question 1
[0] => Array(
[0] => 'question'
[1] => 'answer'
)
// question 2
[1] => Array(
[0] => 'question'
[1] => 'answer'
)
)
// crossword 2
[1] => Array(
// question 1
[0] => Array(
[0] => 'question'
[1] => 'answer'
)
// question 2
[1] => Array(
[0] => 'question'
[1] => 'answer'
)
)
)
好的,所以用户选择填字游戏1,我现在创建一个填字游戏对象,通过访问全局数组的索引1来创建多个Question对象。类似的东西:
Q1 = new Question(globalArr[1][0][0], globalArr[1][0][1]);
Q2 = new Question(globalArr[1][1][0], globalArr[1][1][1]);
我的问题:
我想(希望)有一个更优雅的OOP解决方案。假设有,我会感谢有人分享他们的知识。 Singleton设计会在这里发挥作用吗?
这里的主要目标是制作关于整个应用程序(或至少一个类)可访问的每个问题的硬编码信息
答案 0 :(得分:1)
在Java中提供硬编码值的通用(并且通常是脏的)方法是在类中声明静态字段或数据结构,然后由类加载器提供。这就是大多数情况下单例实现的方式。但是,由于您将创建单个实例的管理委托给您的类加载器(在一个VM中可以有多个类加载器),因此无法保证您将始终使用完全相同的静态数据实例。因此,这不是在多个线程之间传递数据的好方法。
在Android中处理数据/内容的正确方法可能是使用Android内容提供程序API将您的域模型(填字游戏)映射到实现。如果您绝对需要,您还可以提供硬编码值。
通常:使用适当的抽象类型为您的域建模,而不是使用数组。这绝对不是OO的做法。
答案 1 :(得分:1)
怎么样:
您可以使用CrossWord var指向用户选择的CrossWord:
CrossWord selectedCW = crossWords.get(index);
添加Q& A可以使用:
Question q = new Question();
q.setQuestion("question");
q.setAnswer("answer");
selectedCW.add(q);
或重载的构造函数:
selectedCW.add(new Question("question","answer"));
查看Java Collection Framework以选择最佳收藏实施。
答案 2 :(得分:0)
您可以使用Singleton Pattern并将此数组放在一个类中。 http://en.wikipedia.org/wiki/Singleton_pattern
像
public class Question {
private Question() {}; // no one can create a instance
public final static Question INSTANCE = new Question();
private final Array[] array = ...
public getArray() {
return array;
}
对于线程保存,请阅读http://javarevisited.blogspot.de/2012/12/how-to-create-thread-safe-singleton-in-java-example.html