java - 什么是 Java 对 Ruby 单例的等价物

标签 java ruby

在 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 中,方法调用是静态检查的,您不能调用编译器无法确定存在的方法。 (你可以用上面的反射来做到这一点)

关于java - 什么是 Java 对 Ruby 单例的等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23294472/

相关文章:

java - "session.createSQLQuery()"方法是否存在内存泄漏?如何解决呢?

Javassist 热交换程序未找到类

ruby-on-rails - 如何将 transient 的默认值设置为哈希?

java - Java 中的 boolean 和 if/else 语句帮助

java - Spring-MVC + Spring-websocket + @Cacheable 不起作用

java - 使用 Hibernate Validator 验证 POJO,无需 JavaBean 约定

ruby-on-rails - RVM、Ruby 1.9.2、Rails 3、Passenger 3.0.2 (Bundler::GemNotFound)

ruby-on-rails - 如何将电子邮件地址放入 Rails 的 url 中

ruby - 正则表达式提取两个字符串之间的字符串

ruby - 简单的 Ruby 输入验证库