繁体   English   中英

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

[英]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

由于您在构造函数中未使用任何特定于StringText东西(无论是什么),因此可以采用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM