//////////////////////////////////////////////////////// package ch.claude_martin.java8.mixins; import java.util.IdentityHashMap; public interface FooBar { static class Data { int foo = 0; String bar = ""; } // TODO : Should be some kind of WeakIdentityHashMap! final static IdentityHashMap _map = new IdentityHashMap<>(); static Data get(FooBar foobar) { return _map.computeIfAbsent(foobar, x -> new Data()); } default int getFoo() { return get(this).foo; } default void setFoo(int foo) { get(this).foo = foo; } default String getBar() { return get(this).bar; } default void setBar(String bar) { get(this).bar = bar; } } //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// package ch.claude_martin.java8.mixins; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class MixinUsage { public static void main(String... args) { MyActionListener foobar = new MyActionListener(); foobar.setFoo(42); foobar.setBar("Hello"); foobar.actionPerformed(null); } static class MyActionListener implements ActionListener, FooBar { @Override public void actionPerformed(ActionEvent e) { System.out.println("foo: " + getFoo()); System.out.println("bar: " + getBar()); } } } ////////////////////////////////////////////////////////