Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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_Static_Singleton - Fatal编程技术网

Java 在这种情况下,单身汉合适吗?

Java 在这种情况下,单身汉合适吗?,java,static,singleton,Java,Static,Singleton,假设我有一个名为FileManager的类。此类处理创建文件和从这些文件检索数据,以及从这些文件加载和保存数据。这个类只需要有一个实例。我应该使用单例将其作为一个实例保存,因为这就是所需的全部内容,还是每次只创建一个新实例 我要求你用确凿的理由和事实来支持你的答案 编辑:下面是一个使用Singleton的示例。另外一个问题是,这应该使用急切实例化还是惰性实例化?这两者的优点是什么?在这种情况下和一般情况下,哪一个更容易接受 public class FileManager { private

假设我有一个名为FileManager的类。此类处理创建文件和从这些文件检索数据,以及从这些文件加载和保存数据。这个类只需要有一个实例。我应该使用单例将其作为一个实例保存,因为这就是所需的全部内容,还是每次只创建一个新实例

我要求你用确凿的理由和事实来支持你的答案

编辑:下面是一个使用Singleton的示例。另外一个问题是,这应该使用急切实例化还是惰性实例化?这两者的优点是什么?在这种情况下和一般情况下,哪一个更容易接受

public class FileManager {

private static FileManager instance;
private static File kitFile = null;
private static File langFile = null;

private static FileConfiguration langData = null;
private static FileConfiguration kitData = null;

public static FileManager getInstance() {
    if(instance == null)
        instance = new FileManager();
    if(kitFile == null)
        kitFile = new File(Kits.getInstance().getDataFolder(), "Kits.yml");
    if(kitData == null)
        kitData = YamlConfiguration.loadConfiguration(kitFile);
    if(langFile == null)
        langFile = new File(Kits.getInstance().getDataFolder(), "/lang/"+Kits.getInstance().getConfig().getString("lang"));
    if(langData == null)
        langData = YamlConfiguration.loadConfiguration(langFile);
    return instance;
}

代码还提供了创建文件、将数据保存到这些文件以及从这些文件加载数据的方法。这些方法只在一个类中调用。然后,代码中的getter会在各个类中使用。

我认为在这里实现公共getInstance方法不是一个好主意。在这个类中,这是实现saveXXFile、readXXFile方法的更好方法吗?这样,还可以避免代码中可能出现的多线程错误


换句话说,如果我写这篇文章,我可能会在这个类中封装一些名为saveXXFile、readXXFile的方法,而不是向类用户公开文件实例。

它是否携带有状态信息?如果不是,那么我只想让方法静态或静态实用类。如果是,状态信息是否可以跨多个访问点(即多个线程/类)共享?如果不是,那么应该避免使用单例。基于您有限的描述,我倾向于实用类,实际上,该类需要的所有信息都可以通过方法的参数传递给它-不过,您可能还想看看更好的单例实现。我还建议,如果您不想要单例,那么将属性设置为静态是没有意义的。它们实际上相当罕见。我记得唯一一次为DB连接池创建了一个实例,它在其中跨线程共享连接。这不应该是一个单实例,因为您将无法使用其他工具包创建另一个实例。不管是什么,也不应该是单身。