我想知道将自定义类转换为另一个自定义类的最佳方法是什么。 F.E. :
public class TypeA {
String test;
}
public class TypeB {
String test;
}
2种不同的方式:
public TypeA convert(TypeB input) {
TypeA data = null;
if (input != null) {
data = new TypeA();
data.setTest(input.getTest());
}
return data;
}
public TypeA convert(TypeB input) {
final TypeA data;
if (input != null) {
data = new TypeA();
data.setTest(input.getTest());
} else {
data = null;
}
return data;
}
这两种方法之间没有功能差异,我只是想知道这两种方法中的一种是否更好以及为什么。
谢谢
答案 0 :(得分:2)
如果我是诚实的,我宁愿在constructor
。
实施例
public TypeA(TypeB typeB) {
if(typeB != null) {
this.test = typeB.getTest();
}
}
答案 1 :(得分:1)
实例成员会按其默认值自动初始化。对象默认值为null
。
默认情况下,不会初始化局部变量。如果创建最终变量,则必须设置该值。
在第一个选项中,您无法将其作为最终选项,因为您无法再次分配它。
在第二个选项中,你必须在返回之前初始化它,因为它是一个最终变量。
你可以使用其中任何一个。
答案 2 :(得分:1)
实际上有四种方法,取决于你想要课程的紧密程度。
1)使用复制构造函数:
请注意,此术语表示复制实例,因此两者都是同一个类。但它仍然适用于此。
class TypeA {
String test;
TypeA(TypeB input) {
this.test = input.test;
}
}
class TypeB {
String test;
}
2)在TypeA
:
这与构造函数基本相同,但可能更合适,因为您可以自由设计构造函数。
class TypeA {
String test;
private TypeA() { /* private for demonstration purposes */ }
static TypeA fromTypeB(TypeB input) {
TypeA a = new TypeA();
a.test = input.test;
return a;
}
}
class TypeB {
String test;
}
3)在TypeB中使用静态到方法:
这种方法使用的转换技术也出现在许多库中,包括JRE本身。看看Collection.toArray
。
class TypeA {
String test;
}
class TypeB {
String test;
static TypeA toTypeA() {
TypeA a = new TypeA();
a.test = this.test;
return a;
}
}
4)像你一样使用转换方法。优点是TypeA
和TypeB
之间没有任何耦合。
您真正选择哪一个取决于您的设计,您的需求以及这些课程的目的。
答案 3 :(得分:0)
对于引用内存位置的类的成员,您可能希望调用clone()方法,以便在内存中构造该字段的新版本(这样当您更改TypeA的实例时, TypeB实例中的字段保持不变)。我不建议覆盖任一类的克隆方法(为清楚起见)。否则,转换函数几乎相同,并且从作者的角度来看是可读性的。
答案 4 :(得分:0)
如果你想拥有一个尽可能轻松耦合的转换系统,请使用handle the conversions from one type to another的单独类来研究Eclipse本身是如何做到的。有一个中央注册,可以为您提供从Class<A>
到Class<B>
的转换器。