Действительно ли возможно иметь Java printf
оператор, вывод которого является самим оператором?
Некоторый отрывок для иллюстрирования:
// attempt #1
public class Main {
public static void main(String[] args) {
System.out.printf("something");
}
}
Это печатает something
.
Таким образом, вывод попытки № 1 не совсем точно printf
оператор в попытке № 1. Мы можем попробовать что-то вроде этого:
// attempt #2
public class Main {
public static void main(String[] args) {
System.out.printf("System.out.printf(\"something\");");
}
}
И теперь вывод System.out.printf("something");
Таким образом, теперь вывод попытки № 2 соответствует оператору в выводе № 1, но мы вернулись к проблеме, которую мы имели прежде, так как нам нужен вывод попытки № 2 для соответствия оператору в попытке № 2.
Так это возможный записать короткое printf
оператор, который печатает себя?
Это некрасиво, но, безусловно, возможно:
public class Main {
public static void main(String[] args) {
System.out.printf("System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);",34,"System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);");
}
}
Вывод ( при запуске на ideone.com ):
System.out.printf("System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);",34,"System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);");
Этот вывод соответствует оператору printf
.
Вероятно, будут более короткие решения.
java.util.Formatter
синтаксис
% [аргумент_индекс $] преобразование
System.out - это статический экземпляр PrintStream, который можно заменить на любой PrintStream, добавив System.out.setOut(PrintStream s). Поэтому просто напишите подкласс PrintStream и переопределите необходимые методы. Ниже приведен очень простой пример для демонстрации. Рекомендуется переопределить больше методов.
public class VerbosePrintStream extends PrintStream{
public VerbosePrintStream (PrintStream ps){
super(ps, true);
}
@Override
public void println(String x) {
super.println("System.out.println(\""+x + "\");");
}
}
Теперь протестируем вышеуказанный класс:
VerbosePrintStream vps = new VerbosePrintStream(System.out);
System.setOut(vps);
System.out.println("test string");