解决java中缺少模板的问题

时间:2014-08-14 22:36:25

标签: java c++ templates generics

在C ++中,我在cout周围构建一个小包装器:

template <class T>
void output( T a ){
   if(is_this_enabled==true)
      std::cout<<a<<endl;
   return;
}

当某些类型的输出充斥命令行时,我只需要更改is_this_enabled,并且当它们不相关时我可以一站式压制它们。 我是java的新手,我开始写一个类来完成同样的目的。我发现自己正在审阅这些教程,并发现在java中没有直接模拟到模板。

是否有更好/更短的方法来做到这一点然后写伴随每个System.out.println()重载的函数方法?仿制药似乎不会这样做。

3 个答案:

答案 0 :(得分:4)

您可以使用称为自动装箱的功能执行此操作 - 将基元分配给引用类型的变量或字段时,会将其转换为该类型的实例(例如int变为{{1 }}

由于打印对象的行为意味着调用了java.lang.Integer,因此您只需要一个方法:

toString()

答案 1 :(得分:2)

更好的解决方案是使用输出为空的流替换out和err流。

public class Main {
    public static void main( String[] args ) {
        PrintStream out = System.out;
        System.setOut( new PrintStream( new ByteArrayOutputStream() ) );

        System.out.println( "Won't print anything." );

        System.setOut( out );

        System.out.println( "Will print out." );
    }
}

可以为System.err做同样的事情。请记住保留对唯一System.out的引用,否则您可能无法访问stdout。

此解决方案将输出替换为ByteArrayOutputStream,如果要打印大量字符,可以使用大量内存。更好的解决方案是创建一个OutputStream,忽略写入它的所有内容。与/ dev / null类似。

NullOutputStream的示例

public class NullOutputStream extends OutputStream {

    public void write( int b ) throws IOException {}

    public void write( byte[] b, int s, int l ) throws IOException {}

}

没有必要覆盖write(byte [],int,int)但是出于性能原因应该这样做,否则会有l次调用write(int);

答案 2 :(得分:1)

通常不可能将这些短小的C ++翻译成惯用的Java。

您可能希望使用接口代替T(传递给方法的对象必须实现接口)。

您可能也在寻找像log4j这样的东西。