Java 创建字符串对象的新方法的替代方法?
我面临一个问题:我有一个csv文件来准备和提取值。以下是代码(工作正常): } 在那之前可以,但我想要一些更可读、更优雅的东西,比如: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;
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