在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()
重载的函数方法?仿制药似乎不会这样做。
答案 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这样的东西。