Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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_File_Oop_Refactoring_Parameter Passing - Fatal编程技术网

Java 将文件作为参数传递

Java 将文件作为参数传递,java,file,oop,refactoring,parameter-passing,Java,File,Oop,Refactoring,Parameter Passing,我创建了一个示例来介绍我的问题 public class Algorithm { // This is the best, but circumstances prevent me from doing this. /*public static void computeSomething(Data data) { // Compute some stuff }*/ public static void computeSomething(

我创建了一个示例来介绍我的问题

public class Algorithm
{
    // This is the best, but circumstances prevent me from doing this.
    /*public static void computeSomething(Data data)
    {
        // Compute some stuff
    }*/

    public static void computeSomething(DataFileReader reader) throws IOException
    {
        // Compute some stuff.
    }

    public static void computeSomething(File file) throws IOException, DataFormatException
    {
        DataFileReader = DataFileReaderFactory.newDataFileReader(file);

        // Compute some stuff.
    }
}

public class DataFileReaderFactory
{
    private enum FileExtension { XML, UNSUPPORTED_EXTENSION }

    private static final String XMLExtension = ".xml";

    public static DataFileReader newDataFileReader(File file) throws DataFormatException
    {
        switch(computeFileExtension(file))
        {
            case XML :  return new XMLFileReader(file);

            default :   throw new DataFormatException();
        }
    }

    private static FileExtension computeFileExtension(File file)
    {
        if(file.getName().endsWith(XMLExtension))
            return FileExtension.XML;
        else
            return FileExtension.UNSUPPORTED_EXTENSION;
    }
}
因此,我想知道我是应该定义我的接口来获取文件,还是应该定义我自己的文件读取器,以确保数据的格式有效。显然,我希望能够将数据本身作为数据对象,但我在这方面受到限制。原因在于数据非常大,我必须为多个对象序列化数据。在这种情况下,发送数据路径比发送数据本身更为实际


无论如何,关于这个问题,我倾向于采用Java文件实例的方法,因为它看起来更一般,但我想听听你的建议。谢谢

使用允许您在内存中创建测试程序的东西。例如,使用InputStream而不是File,允许您为测试编写简单的InputStream实现,而不必在文件系统上创建文件,将内容放入其中,并在完成后将其删除


如果你有一个获取数据对象的接口,我认为这是最好的。

使用一些允许你在内存中创建测试程序的东西。例如,使用InputStream而不是File,允许您为测试编写简单的InputStream实现,而不必在文件系统上创建文件,将内容放入其中,并在完成后将其删除


如果您有获取数据对象的接口,我认为这是最好的。

我同意上面的答案,即您应该真正使用数据对象/接口。当您进行测试时,您可以创建数据对象的模拟,以便于测试。此外,如果您正在从不同的源读取数据—数据库、文件、内存等,将其转换为相同的流格式可能并不总是那么容易(但您可以为每个源类型提供适配器,将其转换为正确的数据格式)


我注意到你的方法也是静态的。您可能需要考虑使用实例方法并创建算法的实例。实例方法将允许您在需要时存储状态。

我同意上面的回答,即您应该真正使用数据对象/接口。当您进行测试时,您可以创建数据对象的模拟,以便于测试。此外,如果您正在从不同的源读取数据—数据库、文件、内存等,将其转换为相同的流格式可能并不总是那么容易(但您可以为每个源类型提供适配器,将其转换为正确的数据格式)


我注意到你的方法也是静态的。您可能需要考虑使用实例方法并创建算法的实例。如果需要,实例方法将允许您存储状态。

我在这里看到的一个大问题是,您的算法需要一次对完整的数据集进行操作,还是对流格式的数据集进行操作

如果您需要同时使用该数据集来操作您的算法(即在数据元素之间随机来回导航),那么您应该保留注释掉的第一个方法。在其他方法中,获取流并将其读入完整的数据集,然后将完整的数据集传递给算法方法。仅仅因为您需要一个特定的接口,并不意味着您必须将整个实现放到该位置


另一方面,如果这是一个设计用于操作数据流的算法(即路由算法),那么请将垃圾保留在该方法中,并像您应该的那样操作流…

我在这里看到的一个大问题是,您的算法是否需要同时操作整个数据集,还是以流式格式对数据集进行操作

如果您需要同时使用该数据集来操作您的算法(即在数据元素之间随机来回导航),那么您应该保留注释掉的第一个方法。在其他方法中,获取流并将其读入完整的数据集,然后将完整的数据集传递给算法方法。仅仅因为您需要一个特定的接口,并不意味着您必须将整个实现放到该位置


另一方面,如果这是设计用于操作数据流的算法(即路由算法)然后把你的垃圾放在那个方法中,像你应该做的那样在流上操作…

考虑到你的限制,我会有一个使用文件的方法和一个使用DataFileReader并让前者调用后者的方法。如果您可以扩展DataFileReader来创建内存中的读卡器以进行测试,则这一点尤其正确。

鉴于您的限制,我将使用使用文件的方法和使用DataFileReader并让前者调用后者的方法。如果您可以扩展DataFileReader以创建内存中的读卡器进行测试,这一点尤其正确。

不幸的是,流不能序列化,这是算法的必要要求。对于测试和本地执行,我可能会制作一个类似于我在上面示例中注释的算法版本,它允许直接传入数据。不幸的是,流不可序列化,这是算法的必要要求。对于测试和本地执行,我可能会制作一个类似于我在上述示例中注释的算法版本,它允许直接传入数据。在上述方法的主体中,我没有实际读取数据。实际上,我创建了一组任务,这些任务被序列化并通过网络传递。我就是在这里读入数据的。不幸的是,为创建的每个任务序列化数据副本是不可行的。在上述方法的主体中,我没有实际读取数据。实际上,我创建了一组任务,这些任务被序列化并通过网络传递。我就是在这里读入数据的。Unfor