astonbitecode / j4rs

Java for Rust
Apache License 2.0
638 stars 36 forks source link

Disallow returning plain Futures by default #68

Open A248 opened 1 year ago

A248 commented 1 year ago

Suppose I have a large codebase using j4rs, with calls to jvm::invoke_async. I don't want to audit every single call site to ensure the returned future is CompletableFuture. You should consider disallowing the use of plain Future with async methods. Instead, you could expose the wrapper you wrote (J4rsPolledFuture) and have callers use it as needed.

This change would cohere with Rust's culture of paying for what you need explicitly. For example, dynamic dispatch must be enabled with dyn. Costs are not hidden from the programmer.

astonbitecode commented 1 year ago

Thanks for the proposal, I agree with what you say.

The reasoning behind trying to handle the plain Futures was to allow using third party Java libraries from Rust, that return plain Future and cannot be controlled/altered. Of course, in that case, anyone could implement their own wrapping Future as j4rs did, but I wanted to be easy for Rust devs that just want to call Java instead of write Java.

That being said, we could hide the simple Future handling behind a Rust feature. If someone opts-in, the simple Futures will be handled along with the Completable ones. Without opting-in, the simple Futures will not be handled and the async call from Rust will fail with a descriptive error message.

How does it sound @A248?