Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使整个系统(JAVA)可以访问数据数组_Java_Oop - Fatal编程技术网

如何使整个系统(JAVA)可以访问数据数组

如何使整个系统(JAVA)可以访问数据数组,java,oop,Java,Oop,简言之: 在java/Android应用程序启动时,考虑用硬编码值初始化数据数组。然后,在运行时,类可以从该数据中读取数据。它要访问的数组中的确切元素取决于运行时的用户输入 详细内容: 考虑一个纵横字谜应用程序。从主屏幕中,选择要播放的纵横字谜。填字游戏(类),创建多个问题(类)。要创建一个问题,它用两个字符串初始化:“问题”和“答案”。为了让填字游戏产生所有的问题,它需要知道哪些问题属于它。当用户从列表中选择一个纵横字谜时,它会得到一个ID,该ID将映射到(可能)多维数组的元素索引,其中每个外

简言之:

在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解决方案。假设有,我会很感激有人分享他们的知识。单体设计会在这里发挥作用吗

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

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

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

一般来说:使用适当的抽象类型对域进行建模,而不使用数组。这绝对不是OO的方式


阅读本书:

您可以使用Singleton模式并将此数组放入一个类中。

关于线程节省,请阅读以下内容:

  • 将主项纵横字谜定义为纵横字谜对象的单个集合
  • 填字游戏对象包含问题对象的集合
  • 您的问题对象包含两个字段:问题和答案
您可以使用纵横字谜变量指向用户选择的纵横字谜:

CrossWord selectedCW = crossWords.get(index);
要添加问答,可以使用:

Question q = new Question();
q.setQuestion("question");
q.setAnswer("answer");
selectedCW.add(q);
或者通过重载构造函数:

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

请查看以选择最佳收藏实施方案。

不必过多研究,这似乎是一个优雅的解决方案。是否有人提出其他建议?通常,如果您希望在应用程序中提供该数据,您不会在启动时静态实例化所有有效数据(100或1000个或更多带有30个问题和答案的纵横字谜),而只是从持久层加载可用纵横字谜列表,然后只加载所选的纵横字谜。单例模式的解决方案伸缩性不太好。@mwhs-感谢您在这方面的投入。你说“然后只加载所选的填字游戏”,这是我试图实现的目标,但我不确定它的实现。当然,系统必须预先知道所有问答字符串,即使这意味着1000*30个问题。它们一定存在于某个地方,对吗?我不打算实例化每个问题对象,只实例化那些与所选纵横字谜相关的对象,但问题是它将如何检索所选纵横字谜的相关问题是的,它们必须确切地存在于某个地方。但启动时不需要将所有内容加载到内存中。这会用你不需要的东西堵塞你的记忆。这里的关键字称为持久性。大多数人会使用数据库来实现任何类型的持久化机制。在Android中,您可以使用所谓的内容提供者API。看看我下面的答案。@mwhs-谢谢你澄清你的观点。我将研究持久性理论,然后看看它如何适用于Android内容提供商
selectedCW.add(new Question("question","answer"));