Java 创建字符串对象的新方法的替代方法?

Java 创建字符串对象的新方法的替代方法?,java,csv,refactoring,Java,Csv,Refactoring,我面临一个问题:我有一个csv文件来准备和提取值。以下是代码(工作正常): } 在那之前可以,但我想要一些更可读、更优雅的东西,比如: System.out.println(line.getValue(NAME)); 但我们都知道字符串是最终的(也应该是最终的)。有人有什么建议吗?一个选项是在当前有int数组的地方使用枚举: public enum Field { ID(0, 10), NAME(15, 45); private final int start;

我面临一个问题:我有一个csv文件来准备和提取值。以下是代码(工作正常):

}

在那之前可以,但我想要一些更可读、更优雅的东西,比如:

System.out.println(line.getValue(NAME));

但我们都知道字符串是最终的(也应该是最终的)。有人有什么建议吗?

一个选项是在当前有int数组的地方使用枚举:

public enum Field {
    ID(0, 10),
    NAME(15, 45);

    private final int start;
    private final int end;

    private Field(int start, int end) {
        this.start = start;
        this.end = end;
    }

    public string extractFrom(String line) {
        return line.substring(start, end);
    }
}
然后:


这意味着您可以传递字段(例如,有一组用于验证的必填字段),而不必将其设置为
int[]
,这可能意味着任何事情,您还可以添加任何其他自定义方法和信息。(例如,为了进行验证,您可以有一个
模式
字段…

一个选项是在当前有int数组的地方有一个枚举:

public enum Field {
    ID(0, 10),
    NAME(15, 45);

    private final int start;
    private final int end;

    private Field(int start, int end) {
        this.start = start;
        this.end = end;
    }

    public string extractFrom(String line) {
        return line.substring(start, end);
    }
}
然后:


这意味着您可以传递字段(例如,有一组用于验证的必填字段),而不必将其设置为
int[]
,这可能意味着任何事情,您还可以添加任何其他自定义方法和信息。(例如,为了进行验证,您可以有一个
模式
字段…

一个选项是在当前有int数组的地方有一个枚举:

public enum Field {
    ID(0, 10),
    NAME(15, 45);

    private final int start;
    private final int end;

    private Field(int start, int end) {
        this.start = start;
        this.end = end;
    }

    public string extractFrom(String line) {
        return line.substring(start, end);
    }
}
然后:


这意味着您可以传递字段(例如,有一组用于验证的必填字段),而不必将其设置为
int[]
,这可能意味着任何事情,您还可以添加任何其他自定义方法和信息。(例如,为了进行验证,您可以有一个
模式
字段…

一个选项是在当前有int数组的地方有一个枚举:

public enum Field {
    ID(0, 10),
    NAME(15, 45);

    private final int start;
    private final int end;

    private Field(int start, int end) {
        this.start = start;
        this.end = end;
    }

    public string extractFrom(String line) {
        return line.substring(start, end);
    }
}
然后:


这意味着您可以传递字段(例如,有一组用于验证的必填字段),而不必将其设置为
int[]
,这可能意味着任何事情,您还可以添加任何其他自定义方法和信息。(例如,为了进行验证,您可以有一个
模式
字段…

您可以创建自己的类,该类将是
字符串
的包装器(即组合而不是继承):

我建议使用不同于
MyString
的名称,它应该描述这个对象是什么。如果您不需要任何
String
方法,这应该很好。如果你需要一些,你可以简单地委托他们

public MyString {

    // ...

    public int length() {
        return string.length();
    }

    // ...

}

如果您需要all,则有一个
@Delegate
注释可以解决该问题,我实际上不确定。

您可以创建自己的类,该类将作为
字符串的包装(即组合而不是继承):

我建议使用不同于
MyString
的名称,它应该描述这个对象是什么。如果您不需要任何
String
方法,这应该很好。如果你需要一些,你可以简单地委托他们

public MyString {

    // ...

    public int length() {
        return string.length();
    }

    // ...

}

如果您需要all,则有一个
@Delegate
注释可以解决该问题,我实际上不确定。

您可以创建自己的类,该类将作为
字符串的包装(即组合而不是继承):

我建议使用不同于
MyString
的名称,它应该描述这个对象是什么。如果您不需要任何
String
方法,这应该很好。如果你需要一些,你可以简单地委托他们

public MyString {

    // ...

    public int length() {
        return string.length();
    }

    // ...

}

如果您需要all,则有一个
@Delegate
注释可以解决该问题,我实际上不确定。

您可以创建自己的类,该类将作为
字符串的包装(即组合而不是继承):

我建议使用不同于
MyString
的名称,它应该描述这个对象是什么。如果您不需要任何
String
方法,这应该很好。如果你需要一些,你可以简单地委托他们

public MyString {

    // ...

    public int length() {
        return string.length();
    }

    // ...

}

如果您需要all,那么它有一个
@Delegate
注释,可以解决这个问题,我实际上不确定。

看起来您正在寻找一些抽象,可以让您查询文件中的不同列。为什么不模仿
java.sql.ResultSet
?e、 g

public static void main(String args[]) throws IOException {
    BufferedReader file = new BufferedReader(new FileReader("./datacol.txt"));

    // Build the recordset for the file
    RecordSet rec = new RecordSet(file);

    // Iterate on the lines or "records" in the file
    while (rec.next()) {
        try {
            System.out.println(rec.getInt(FooField.ID)); // get the right type
            System.out.println(rec.getString(FooField.NAME));
        }
        catch (Exception e) {
            System.out.println(e.toString());
        }
    }
}
RecordSet
class包装文件并允许您提取行。为此,您需要使用某个对象来描述文件列,该对象将由
记录集使用。下面是@Jon提出的描述符,带有
enum
,但它实现了一个简单的接口
RecordField
。此接口的目的是允许记录集使用不同的字段描述符:

public interface RecordField {
    String getFieldValue(String line);
}

// Describe a specific file ("Foo") with its columns (or fields)
public enum FooField implements RecordField {
    ID(0,10),
    NAME(15, 45);

    private final int start;
    private final int end;

    private FooField(int start, int end) {
        this.start = start;
        this.end = end;
    }

    @Override
    public String getFieldValue(String line) {
        if (line.length() < start || line.length() < end) {
            throw new RuntimeException("Invalid line length for "+this);
        }
        return line.substring(start, end);
    }

}

看起来您正在寻找某种抽象,它允许您查询文件中的不同列。为什么不模仿
java.sql.ResultSet
?e、 g

public static void main(String args[]) throws IOException {
    BufferedReader file = new BufferedReader(new FileReader("./datacol.txt"));

    // Build the recordset for the file
    RecordSet rec = new RecordSet(file);

    // Iterate on the lines or "records" in the file
    while (rec.next()) {
        try {
            System.out.println(rec.getInt(FooField.ID)); // get the right type
            System.out.println(rec.getString(FooField.NAME));
        }
        catch (Exception e) {
            System.out.println(e.toString());
        }
    }
}
RecordSet
class包装文件并允许您提取行。为此,您需要使用某个对象来描述文件列,该对象将由
记录集使用。下面是@Jon提出的描述符,带有
enum
,但它实现了一个简单的接口
RecordField
。此接口的目的是允许记录集使用不同的字段描述符:

public interface RecordField {
    String getFieldValue(String line);
}

// Describe a specific file ("Foo") with its columns (or fields)
public enum FooField implements RecordField {
    ID(0,10),
    NAME(15, 45);

    private final int start;
    private final int end;

    private FooField(int start, int end) {
        this.start = start;
        this.end = end;
    }

    @Override
    public String getFieldValue(String line) {
        if (line.length() < start || line.length() < end) {
            throw new RuntimeException("Invalid line length for "+this);
        }
        return line.substring(start, end);
    }

}

看起来您正在寻找某种抽象,它允许您查询文件中的不同列。为什么不模仿
java.sql.ResultSet
?e、 g

public static void main(String args[]) throws IOException {
    BufferedReader file = new BufferedReader(new FileReader("./datacol.txt"));

    // Build the recordset for the file
    RecordSet rec = new RecordSet(file);

    // Iterate on the lines or "records" in the file
    while (rec.next()) {
        try {
            System.out.println(rec.getInt(FooField.ID)); // get the right type
            System.out.println(rec.getString(FooField.NAME));
        }
        catch (Exception e) {
            System.out.println(e.toString());
        }
    }
}
RecordSet
class包装文件并允许您提取行。为此,您需要使用某个对象来描述文件列,该对象将由
记录集使用。下面是@Jon提出的描述符,带有
enum
,但它实现了一个简单的接口
RecordField
。此接口的目的是允许记录集使用不同的字段描述符:

public interface RecordField {
    String getFieldValue(String line);
}

// Describe a specific file ("Foo") with its columns (or fields)
public enum FooField implements RecordField {
    ID(0,10),
    NAME(15, 45);

    private final int start;
    private final int end;

    private FooField(int start, int end) {
        this.start = start;
        this.end = end;
    }

    @Override
    public String getFieldValue(String line) {
        if (line.length() < start || line.length() < end) {
            throw new RuntimeException("Invalid line length for "+this);
        }
        return line.substring(start, end);
    }

}

看起来您正在寻找某种抽象,它允许您查询文件中的不同列。W