Java:重载相互调用的构造函数
考虑一个类,该类从CSV行中找到的数据实例化,并存储其一些字段。为这个类创建两个构造函数是有意义的——一个来自原始CSV行,另一个带有显式变量赋值 e、 gJava:重载相互调用的构造函数,java,constructor,overloading,Java,Constructor,Overloading,考虑一个类,该类从CSV行中找到的数据实例化,并存储其一些字段。为这个类创建两个构造函数是有意义的——一个来自原始CSV行,另一个带有显式变量赋值 e、 g 公共MyClass(字符串csvLine) { String[]fields=StringUtils.split(csvLine,,); 这(字段[3],字段[15],Integer.parseInt([fields[8]); } 公共MyClass(字符串名称、字符串地址、整数期限) { this.name=name; 这个地址=地址;
公共MyClass(字符串csvLine)
{
String[]fields=StringUtils.split(csvLine,,);
这(字段[3],字段[15],Integer.parseInt([fields[8]);
}
公共MyClass(字符串名称、字符串地址、整数期限)
{
this.name=name;
这个地址=地址;
这个。年龄=年龄;
}
在Java中,这会失败,因为:
构造函数调用必须是
构造函数WhereOnEarth.java
实现这一点的正确方法是什么?创建一个方法
private init(String name, String address, Integer age) {}
从两个构造函数调用它。以下是我的看法:
public class MyClass {
public static MyClass fromCsvLine(String csvLine) {
String[] fields = StringUtils.split(csvLine, ',');
return new MyClass(fields[3], fields[15], Integer.parseInt([fields[8]));
}
//...
}
用法:
MyClass my = MyClass.fromCsvLine("...");
我不会混合表示已解析内容的类和内容解析类。我会创建一个MayClassFactory或类似的东西:
public class MyClassFactory {
public MyClass fromCsvLine(String csvLine) {
String[] fields = StringUtils.split(csvLine, ',');
return new MyClass(fields[3], fields[15], Integer.parseInt([fields[8]));
}
//...
}
唯一的问题是,这使得不可能使用最终变量。除了使用静态初始值设定项之外,这并不是一个好办法——你们可以用构造函数和代码复制来解决这个问题,但显然这会变得很难看。我更喜欢这种方法(双关!)由于它便于测试。+1这也可能是
MyClass
,例如MyClass.parse(String csv)
(如果不介意稍微混合!)@DNA:yep,请参阅我的答案。尽管解析有点复杂(或者有多个源,例如XML),非常鼓励解耦。我只对util类使用静态,如StringUtils等。在编写工厂时,我会为继承而设计,因此如果可能的话,不使用静态。但是,如果您愿意,可以将其设置为静态内部类。为什么它是一个实例方法?@TomHawtin-tackline:我支持非静态方法。MyClassFactory
可能是有状态的,例如持有CSV解析配置/验证规则。可能MyClass
不应该“知道”CSV文件,因此放入不同的类(以及toCSVLine
可能更有意义)。但当然静态创建方法是一种方法-构造函数有点混乱。