On Fri, 25 Apr 2025 07:54:03 GMT, Johannes Döbler <d...@openjdk.org> wrote:
>>> @AlanBateman I have modified it to use interface + record. Is this what you >>> want? >> >> I don't object to changing it to interface + record but it feels more like >> needless code churn. I really disliked the next version that used >> printStackTrace0(Object printer) as it immediately invites another re-write. > > The record has fewer source lines but doesn't the generated record class have > a getter, toString(), hashCode() and equals(Object) which are not needed here? > What about using a lock parameter and a method handle to pass in the required > features of PrintStream and PrintWriter: > > public void printStackTrace(PrintWriter pw) { > printStackTrace(pw, pw::println); > } > > public void printStackTrace(PrintStream ps) { > printStackTrace(ps, ps::println); > } > > private void printStackTrace(Object lock, Consumer<Object> println) { > synchronized(lock) { > ... > println.accept(this); > ... > } > } FYI lambda expressions depend on java.lang.invoke, and if anything initialized before that throws an exception and needs to print stack trace, the VM will fail with a traceless `StackOverflowError` I think. Consumer class is fine for early loading, but to implement that, we fall back to records again. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/24795#discussion_r2060345723