如何使用一个通用构造函数替换两个Java构造函数

时间:2014-06-09 14:52:55

标签: java 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());
    }
}

Text是一个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

5 个答案:

答案 0 :(得分:5)

由于您未在构造函数中使用StringText(无论是什么)特定的任何内容,因此您可以将Iterable<? extends Object>作为参数:

public MyObject(Iterable<? extends Object> values){
    for(Object val: values){
        System.out.println(val.toString());
    }
}

答案 1 :(得分:2)

你可以这样做:

public MyObject(Iterable<? extends Object> values){
    for(String val: values){
        System.out.println(val.toString());
    }
}

完全失去第一个构造函数。

或者看看你是否可以让一个构造函数修改参数然后调用另一个。

答案 2 :(得分:2)

尝试使用 Generic

ArrayList也实现了Iterable,因此任何实现Iterable的东西都可以传入构造函数。

不需要任何其他构造函数。这个单一的构造函数可以用于所有类型的Iterable类。

public class MyObject<T> {

    public MyObject(Iterable<T> values) {
        for (T val : values) {
            System.out.println(val.toString());
        }
    }
}

答案 3 :(得分:0)

Text是您自己代码库中的一个类吗?如果是这样,你能否实现CharSequence java.util.String已经实现的public MyObject(Iterable<? extends CharSequence> values) { ... } (在Java的更高版本中 - 从那以后不确定)。然后你的一个人将是:

MyObject

(我假设你的真实代码在ctor中做的不仅仅是打印对象;否则你为什么要首先创建一个{{1}}实例?)

答案 4 :(得分:0)

你可以试试......

public MyObject(Collection collection) {

   for (Object obj : collection) {
      System.out.println(obj.toString());
   }
}