A standard for declaring and working with APIs that require explicit opt-in in Java.
// Create a requirement marker
@RequiresOptIn(message = "This API is subject to change and may change without prior notice.")
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface ExperimentalNotifications {}
interface MyNotificationProcessor {
void sendOldNotification();
@ExperimentalNotifications // Declares an opt-in requirement
void sendFancyNewNotification();
}
// Opts-in into the requirement marker
@OptIn(ExperimentalNotifications.class)
void onMessage(MyNotificationProcessor processor) {
processor.sendFancyNewNotification();
}This project uses Gradle's toolchain support to detect and select the JDKs required to run the build. Please refer to the build scripts to find out which toolchains are requested.
An installed JDK 17 (or later) is required to use Gradle.
Once the setup is complete, invoke the respective Gradle tasks using the following command on Unix/macOS:
./gradlew <tasks>
or the following command on Windows:
gradlew <tasks>
Important Gradle tasks to remember are:
clean- clean build resultsbuild- assemble and test the Java librarypublishToMavenLocal- build and install all public artifacts to the local maven repository
Additionally tasks may be used to print a list of all available tasks.
This project was heavily inspired by and is compatible with Kotlin's mechanism for opt-in requirements. It aims to introduce a common, more easily accessible standard for opt-in requirements to the Java ecosystem to bolster code evolution practices with robust static analysis.
Copyright 2022-2026 Leon Linhart
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.