0

简而言之:

在启动 Java/Android 应用程序时,考虑使用硬编码值初始化的数据数组。然后,在运行时,一个类可以读取该数据。它将要访问的数组中的确切元素取决于运行时的用户输入。

详细地:

考虑一个填字游戏应用程序。从主屏幕中,您选择要玩的填字游戏。一个填字游戏(类),创建多个问题(类)。为了创建一个问题,它使用两个字符串进行初始化:“问题”和“答案”。为了让填字游戏创建所有问题,它需要知道哪些问题属于它。当用户从列表中选择填字游戏时,它会传递一个 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 创建多个问题对象。就像是:

Q1 = new Question(globalArr[1][0][0], globalArr[1][0][1]);
Q2 = new Question(globalArr[1][1][0], globalArr[1][1][1]);

我的问题:

我想(希望)对此有更优雅的 OOP 解决方案。假设有,我会很感激有人分享他们的知识。单例设计会在这里发挥作用吗?

这里的主要目标是使每个问题的硬编码信息可供整个应用程序(或至少一个类)访问

4

3 回答 3

1

在 Java 中提供硬编码值的通用(并且大部分是肮脏的)方法是在类中声明静态字段或数据结构,然后由类加载器使其可用。这就是在大多数情况下实现单例的方式。但是,由于您将创建单个实例的管理委托给类加载器(一个 VM 中可以有多个类加载器),因此无法保证您将始终使用完全相同的静态数据实例。所以这不是在多个线程之间传递数据的好方法。

在 Android 中处理数据/内容的正确方法可能是将您的域模型(填字游戏)映射到使用 Android Content Provider API 的实现。如果您绝对需要,您还可以提供硬编码值。

一般来说:使用适当的抽象类型而不是使用数组对您的域建模。这绝对不是面向对象的做法。

阅读本书:http ://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=sr_1_1?ie=UTF8&qid=1383562013&sr=8-1&keywords=domain+driven+design

于 2013-11-04T10:43:25.407 回答
1

怎么样:

  • 将您的主要项目 crossWords 定义为 CrossWord 对象的单例集合
  • 您的填字游戏对象包含一个问题对象集合
  • 您的 Question 对象包含 2 个字段:问题和答案

您可以使用 CrossWord var 指向用户选择的 CrossWord:

CrossWord selectedCW = crossWords.get(index);

添加问答可以使用:

Question q = new Question();
q.setQuestion("question");
q.setAnswer("answer");
selectedCW.add(q);

或通过重载的构造函数:

selectedCW.add(new Question("question","answer"));

查看Java 集合框架以选择最佳集合实现。

于 2013-11-04T10:47:20.040 回答
0

您可以使用单例模式并将这个数组放在一个类中。 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

于 2013-11-04T10:45:52.130 回答