Back
Syntax
Study
Editor
Mode:
HTML
CSS
JavaScript
PHP
Reset
Run »
HTML / CSS / JS
import java.util.Comparator; import java.util.List; interface Validator<T> { // Abstract method boolean isValid(T value); // Default method — provides a convenience inverse default boolean isInvalid(T value) { return !isValid(value); } // Default method — and-combination of validators default Validator<T> and(Validator<T> other) { return value -> this.isValid(value) && other.isValid(value); } // Static factory method static <T> Validator<T> nonNull() { return value -> value != null; } } class RangeValidator implements Validator<Integer> { private final int min, max; RangeValidator(int min, int max) { this.min = min; this.max = max; } @Override public boolean isValid(Integer value) { return value != null && value >= min && value <= max; } } interface Greetable { default String greet(String name) { return "Hello, " + name; } } interface Farewell { default String greet(String name) { return "Goodbye, " + name; } // same signature! } class ConflictResolved implements Greetable, Farewell { @Override public String greet(String name) { // Must override to resolve the conflict return Greetable.super.greet(name) + " / " + Farewell.super.greet(name); } } public class DefaultStaticMethods { public static void main(String[] args) { Validator<Integer> range = new RangeValidator(1, 100); Validator<Integer> nonNull = Validator.nonNull(); Validator<Integer> both = nonNull.and(range); List.of(null, -5, 0, 50, 100, 101).forEach(v -> System.out.printf("%-5s -> valid=%b, invalid=%b%n", v, both.isValid(v), both.isInvalid(v)) ); ConflictResolved cr = new ConflictResolved(); System.out.println(cr.greet("Alice")); } }
Result
Open