[英]How to replace two Java Constructors with one generic Constructor
我有以下两种java方法(简体)。 我想用一种方法替换这两种方法。 想要这样做的原因是一种方法用于本地测试,一种方法在Hadoop集群上运行期间使用。 我只是花了一些时间调试代码,然后才意识到我已经调整了一种方法而不是另一种方法,并且想知道将来如何避免这种愚蠢的错误。
public MyObject(ArrayList<String> values){
for(String val: values){
System.out.println(val.toString());
}
}
public MyObject(Iterable<Text> values){
for(Text val: values){
System.out.println(val.toString());
}
}
文本是一个Apache hadoop类。 这是源代码的链接。 http://grepcode.com/file/repository.cloudera.com/content/repositories/releases/com.cloudera.hadoop/hadoop-core/0.20.2-737/org/apache/hadoop/io/Text.java
由于您在构造函数中未使用任何特定于String
或Text
东西(无论是什么),因此可以采用Iterable<? extends Object>
Iterable<? extends Object>
作为参数:
public MyObject(Iterable<? extends Object> values){
for(Object val: values){
System.out.println(val.toString());
}
}
您可以这样做:
public MyObject(Iterable<? extends Object> values){
for(String val: values){
System.out.println(val.toString());
}
}
并完全失去了第一个构造函数。
或者查看是否可以让一个构造函数修改参数,然后再调用另一个。
尝试使用泛型 。
ArrayList中也实现了Iterable以便实现任何东西Iterable
可以在构造函数中传递。
不需要任何其他构造函数。 这个单一的构造函数Iterable
所有Iterable
类类型的目的。
public class MyObject<T> {
public MyObject(Iterable<T> values) {
for (T val : values) {
System.out.println(val.toString());
}
}
}
Text
是您自己的代码库中的类吗? 如果是这样,您能否使其实现java.util.String
已经完成的CharSequence
(在Java的更高版本中-从何时开始还不确定)。 然后,您的一个ctor将是:
public MyObject(Iterable<? extends CharSequence> values) { ... }
(我假设您的实际代码在ctor中所做的不仅仅是打印对象;否则,为什么首先要创建MyObject
实例?)
您可以尝试...
public MyObject(Collection collection) {
for (Object obj : collection) {
System.out.println(obj.toString());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.