Java-如何在多种方法中使用HashMap [关闭]

问题描述 投票:0回答:1

我可能有一个较小的应用程序设计(也许理解)问题。如果以下问题与noob类似,请原谅我。我三周前才开始学习Java,但是找不到适合我问题的正确答案。

情况:我正在尝试将旧的酒吧游戏引入Java和JavaFX作为UI的数字化版本。我正在使用MVC设计,而我使用控制器通过用户单击来启动游戏的开始。然后,控制器为游戏做所有准备工作。一个重要的部分是从一个类Player创建n个(玩家数量)对象并将它们写入HashMap。这可能会引发设计问题:地图及其引用的对象拥有玩家的所有核心游戏信息。因此,我几乎总是在控制器和模型的方法之间移交Map,以便始终可以重用Map中的信息。现在,我要完成初始程序/游戏板的设置,并且游戏需要等待用户按下按钮的输入。

已尝试/想法:我最初以为可以将任何方法(如OnAction)放在按钮上,然后从那里继续。但是由于我所有的方法都需要Map作为输入参数,因此我无法将该方法作为按钮的OnAction(在SceneBuilder中)。

问题:实际上,问题是(就我所知),我没有集中化的Map(这是我的中央数据存储,可以通过各种方法进行更新,并且应通过用户操作进行更新),并且“方法独立”。因此,由于我想通过用户单击来调用方法,因此该方法独立于任何“程序流”,因此如何在此处访问我的Map以相应地更新数据并在后续程序中重用该Map。

如上所述,我认为有一个非常容易解决此问题的方法,可能我没有详细了解其中一个基本概念,但希望我能以一种可以理解的方式解释我的问题。

java javafx scenebuilder
1个回答
2
投票

您要查找的术语是Cohesion

内聚性是对类或模块的方法如何有意义和紧密相关以及它们在为系统提供明确定义的目的方面的关注程度的一种度量。检查this了解更多信息。

让我们来看看这堂课:

import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class FileMetadataExtractor {
    public FileMetadataExtractor() {
    }

    private Date extractLastModificationDate(File file) {
        return new Date(file.lastModified());
    }

    private String extractFileName(File file) {
        return file.getName();
    }

    private String extractExtension(File file) {
        String fileName = extractFileName(file);
        int i = fileName.lastIndexOf('.');
        String extension = "";
        if (i > 0) {
            extension = fileName.substring(i+1);
        }
        return extension;
    }

    public Map<String, String> extractMetadata(File file) {
        String name = extractFileName(file);
        String lastModified = String.valueOf(extractLastModificationDate(file));
        Map<String, String> metadata = new HashMap<>();
        metadata.put("file_name", name);
        metadata.put("last_modified", lastModified);
        metadata.put("extension", extractExtension(file));
        return metadata;
    }
}

据我了解,该课程看起来像您的课程。此类的凝聚力低。这意味着该类不专注于为其创建的目标,并且该类的成员之间存在松散的关系。凝聚力越高,班级就可以做得更好。

现在让我们看一下该类的另一个版本:

import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class FileMetadataExtractor {
    private final File file;

    public FileMetadataExtractor(File file) {
        this.file = file;
    }

    private Date extractLastModificationDate() {
        return new Date(file.lastModified());
    }

    private String extractFileName() {
        return file.getName();
    }

    private String extractExtension() {
        String fileName = extractFileName();
        int i = fileName.lastIndexOf('.');
        String extension = "";
        if (i > 0) {
            extension = fileName.substring(i+1);
        }
        return extension;
    }

    public Map<String, String> extractMetadata() {
        String name = extractFileName();
        String lastModified = String.valueOf(extractLastModificationDate());
        Map<String, String> metadata = new HashMap<>();
        metadata.put("file_name", name);
        metadata.put("last_modified", lastModified);
        metadata.put("extension", extractExtension());
        return metadata;
    }
}

现在,该类的成员和方法之间的关系很紧密,该类仅需要一次File实例即可使所有其他方法正常工作。您可以在课堂上做同样的事情,并共享其他方法或成员将使用的成员。

请阅读有关cohesion and coupling的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.