Marshall Bockrath-Vandegrift
atl-clj / 2013-08-13
Seeing through Java’s lies
(.methodName object arg0 arg1)
(. object methodName arg0 arg1)
(Type/methodName arg0 arg1)
(. Type methodName arg0 arg1)
(.methodName object ^Type arg0)
Type methodName(Type args...)
(.methodName object (into-array Type args))
(Type. arg0 arg1)
(new Type arg0 arg1)
import package.Outer.Inner;
(import '[package Outer$Inner])
(instance? java.lang.String "foo")
(instance? java.util.List [])
(instance? java.util.Map {})
(instance? java.util.Set #{})
“Java happens”
Ha ha! Just kidding.
(instance? java.lang.Runnable (fn []))
(instance? java.util.Comparator (fn []))
(instance? java.util.concurrent.Callable (fn []))
(reify Interface
(someMethod [this arg0 arg1] result))
reify
vs gen-class
– when to use?
reify
– anonymous, interfacesgen-class
– neverclass ActualClass extends AbstractBaseClass {
private static class Vars {
private static final String NS = "some.namespace";
private static final Var someFunction =
RT.var(NS, "some-function");
static {
RT.var("clojure.core", "require").invoke(Symbol.intern(NS));
}
}
@SomeAnnotation("arg")
public Object someMethod(Object arg) {
return Vars.someFunction.invoke(arg);
}
}
proxy
deftype