解决java中缺乏模板的问题

Work around the lack of templates in java

本文关键字:问题 java 解决      更新时间:2023-10-16

在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()的重载编写伴随的函数方法?泛型似乎做不到。

你可以使用一个被称为自动装箱的特性来做到这一点——当一个原语被分配给一个引用类型的变量或字段时,它被转换成该类型的实例(例如int变成java.lang.Integer)。

由于打印对象的行为意味着调用了toString(),因此您可以简单地使用一个方法:

void output(Object o){
    if(outputEnabled)
        System.out.println(o.toString());
}

更好的解决方案是将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也可以做同样的事情。记住要保留对唯一系统的引用。输出,否则将失去对标准输出的访问权限。

此解决方案将输出流替换为打印到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),但出于性能考虑,应该这样做,否则将会调用write(int);

一般不可能把这么短的c++代码翻译成习惯的Java。

你可能想用一个接口来代替T(你传递给方法的对象必须实现这个接口)。

您可能还在寻找类似log4j的东西