在java中,super不能作为构造函数的第一行时的解决方案

在java中,super不能作为构造函数的第一行时的解决方案,java,Java,我使用的是一个CSVReader类,它将本地文件作为输入。但现在,我需要能够读取本地文件以及具有URL路径的文件(如)。为此,我想从CSVReader派生一个类来标识文件是本地的还是URL的,然后在构造函数的第一行使用super()将InputStream传递给父级。这样做的优雅方式是什么 public class FileReader extends CsvReader{ public FileReader(){ if (fileName != null) {

我使用的是一个CSVReader类,它将本地文件作为输入。但现在,我需要能够读取本地文件以及具有URL路径的文件(如)。为此,我想从CSVReader派生一个类来标识文件是本地的还是URL的,然后在构造函数的第一行使用super()将InputStream传递给父级。这样做的优雅方式是什么

public class FileReader extends CsvReader{
    public FileReader(){
        if (fileName != null) {

               if (fileName.trim().startsWith("http:")) {
                // it is URL
                URL url = new URL(fileName);
                inputStream = new BufferedReader(new InputStreamReader(
                        url.openStream(), charset),
                        StaticSettings.MAX_FILE_BUFFER_SIZE); 
               }else{
                //it is a local file
                inputStream = new BufferedReader(new InputStreamReader(
                        new FileInputStream(fileName), charset),
                        StaticSettings.MAX_FILE_BUFFER_SIZE);
               } 

            }
            //Now pass the input stream to CsvReader
            super(inputStream, delimiter, charset);  //error - super has to be first line of constructor
    }
}

将用于计算
super()
参数的代码移动到静态函数中,并在
super()
内部调用它。您可以将构造函数声明为
private
,并创建工厂静态方法,该方法将在调用构造函数之前进行检查。

您可以编写辅助方法:

super(createReader(createInputStream(resouce), "UTF-8"), ";");
您的辅助方法可能如下所示:

public static InputStream createInputStream(String resource)
{
     resource = resource.trim();

     if (resource.startsWith("http:"))
     {
          return new URL(resource).openStream();
     } else
     {
          return new FileInputStream(new File(resource));
     }
}

public static BufferedReader createReader(InputStream is, String charset)
{
     return new BufferedReader(new InputStreamReader(is, charset));
}

您可以重构代码以包含静态方法,该方法将创建所有必要的内容,然后调用构造函数:

public class FileReader extends CsvReader
{
    public static FileReader createFileReader(String filename, String delimiter, String charset){
        if (fileName != null) {
           BufferedReader inputStream;
           if (fileName.trim().startsWith("http:")) {
               // it is URL
               URL url = new URL(fileName);
               inputStream = new BufferedReader(new InputStreamReader(url.openStream(), charset), StaticSettings.MAX_FILE_BUFFER_SIZE); 
           }
           else
           {
                //it is a local file
                inputStream = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), charset), StaticSettings.MAX_FILE_BUFFER_SIZE);
           } 
           return new FileReader(inputStream, delimiter, charset);
       }
       return null;
    }

    public FileReader(BufferedReader inputStream, String delimiter, String charset){
            super(inputStream, delimiter, charset);
    }
}

方法
constructInputStream
必须声明为
static
@JakubZaverka:没问题;)请不要使用与JDK中已知类相同的名称来调用您的类。你会给别人带来很大的困惑,很可能是你自己。