解决java中缺乏模板的问题
Work around the lack of templates in java
在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的东西
相关文章:
- 在java中解决这段代码时面临循环中的问题
- Java 客户端C++服务器数据发送/接收问题
- 父进程意外被子 cmd 杀死.exe运行 java jar 的进程 - WINDOWS 7 问题 - C++
- 将 Java ArrayList 转换为 C++ 向量时出现问题
- Java Native方法,出了问题
- 无法找出 Java 等效的 "passing by reference" 在C++解决这个问题,以及最好的解决方法
- 使用JNI从Java调用本机(C++)函数时发生访问冲突:这是我的代码问题,还是已知问题
- C++代码到Java,很少有问题
- JNI在将Java double转换为jdouble时出现问题
- C++等价于Java导入等问题
- GraphicsMagick使用c++java本机代码的性能问题
- 从导致问题的java进程附加到外部c++进程
- 我的这个C++ CRC32 函数的 Java 端口有什么问题
- 简单的 Java 代码,在创建等效C++(私有静态成员和公共访问器方法)时遇到问题
- omniORB C++服务器,Java 客户机在运行应用程序时出现问题
- 在机器上运行时,编译的源代码(C++、Java 等)涉及哪些安全问题
- 从java到c++jni android arm64-v8a 32/64位的传递mat问题
- 从c++调用java方法时出现问题
- C++抽象类的问题(我可以用Java做,但不能用C++!)
- 性能问题:Java vs c++