在Ruby中,我可以创建特定于实例的方法(单例方法)

class C;end

v1,v2 = C.new, C.new #=>two instances of class C

def v1.meth
  puts "I am only available in instance v1"
end

puts v1.meth #=> prints -> I am only available in instance v1
puts v2.meth #=> throws -> undefined method 'meth'

它在Java中等效于什么?

最佳答案

您最能做的就是拥有匿名类。

class C {}

C v1 = C() {
    void meth() {
        puts("I am only available in instance v1");
    }
};
C v2 = new C();

// prints -> I am only available in instance v1
v1.getClass().getMethod("meth").invoke(v1);
// throws NoSuchMethodException
v2.getClass().getMethod("meth").invoke(v2);

在Java 8中,您可以编写
interface C {
    void meth();
}

C v1 = () -> puts("I am only available in instance v1");
C v2 = () -> { throws new UnsupportedOperationException(); }

v1.meth();
v2.meth();

在自然的Java方法中,调用是静态检查的,您不能调用编译器无法确定存在的方法。 (您可以通过上述反射来完成此操作)

10-06 13:31