Я недавно наткнулся на этот пост в Vanilla # Java . Не очень удобно писать Arrays.toString(arr);
, а потом импортировать java.util.Arrays;
все время.
Обратите внимание, что это не постоянное исправление ни в коем случае. Просто взлом, который может сделать отладку проще.
Печать массива напрямую дает внутреннее представление и hashCode. Теперь все классы имеют Object
в качестве родительского типа. Так почему бы не взломать Object.toString()
? Без изменения класс Object выглядит следующим образом:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Что если это изменить на:
public String toString() {
if (this instanceof boolean[])
return Arrays.toString((boolean[]) this);
if (this instanceof byte[])
return Arrays.toString((byte[]) this);
if (this instanceof short[])
return Arrays.toString((short[]) this);
if (this instanceof char[])
return Arrays.toString((char[]) this);
if (this instanceof int[])
return Arrays.toString((int[]) this);
if (this instanceof long[])
return Arrays.toString((long[]) this);
if (this instanceof float[])
return Arrays.toString((float[]) this);
if (this instanceof double[])
return Arrays.toString((double[]) this);
if (this instanceof Object[])
return Arrays.deepToString((Object[]) this);
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Этот модифицированный класс можно просто добавить в путь к классу, добавив в командную строку следующее: -Xbootclasspath/p:target/classes
.
Теперь, с появлением deepToString(..)
, начиная с Java 5, toString(..)
можно легко изменить на deepToString(..)
, чтобы добавить поддержку массивов, содержащих другие массивы.
Я считаю, что это довольно полезный хак, и было бы здорово, если бы Java могла просто добавить это. Я понимаю потенциальные проблемы с очень большими массивами, так как строковые представления могут быть проблематичными. Может быть, передать что-то вроде System.out
или PrintWriter
для таких случаев.