【问题标题】:equivalence of Ruby :symbol in Java?Ruby :symbol 在 Java 中的等价性?
【发布时间】:2013-10-19 22:53:13
【问题描述】:

noticed the neat features of ruby symbols here

java有类似的吗?它会叫什么?

D 不认为最终的字符串可以完成所有功能。特别是它的存储方式,它仍然需要一个 toString 进行比较。

【问题讨论】:

  • 澄清一下:Ruby 字符串表现得像可变但实际上像符号一样不可变。它在内部创建新字符串并替换指向新字符串的引用
  • 为了专门解决存储和比较问题,interned String 将提供类似的行为(通常是字符串文字)。

标签: java ruby symbols


【解决方案1】:

符号实际上是不可变标识符。它们无法更改,不会被垃圾回收,并且比字符串具有性能优势。我假设您已经知道 String 是什么。所以答案是:Java 没有 Symbols 这样的东西。

就像@Idan 说的(这很聪明)枚举可以用作符号除了它们没有你可以调用的方法。 Ruby 中的符号不是不可变的字符串。

如果您想了解它们的核心差异,请参阅 this post

【讨论】:

  • 说枚举没有方法是误导或误导。
  • @MattWhipple 当我写这个答案时,我确实被误导了。答案已编辑。
【解决方案2】:

“Java 有这个特性吗?”的一般答案问题是“不!”。但是,enums 通常可以解决符号解决的相同问题。

【讨论】:

  • +1 以消除我们都得到的反对票。一直认为没有 cmets 的 downvote 很不成熟。
  • 非常感谢想重写一些旧的 java 代码来使用它,我认为枚举可以解决问题
【解决方案3】:

Ruby 符号是一个不可变的字符串对象,它在符号表中被索引以供单引用重用(因此是非常有创意的命名法!)。

在 Java 中,所有 String 对象是不可变的,所有它们都在(发明命名的)符号表中被索引以供 JVM 重用(只要它们被引用并生效)。

因此,在 Java 中,String ("my_symbol") 等效于 Ruby 符号 (:my_symbol)。

要获得与 Ruby 'my string'(非不可变)等效的东西,您必须使用更复杂的 Java 类(new StringBuilder("my string") 等)。或者,如果您让 Groovy 加载了 JVM,它会使用 GString 覆盖类似的可变概念。

【讨论】:

  • 关于重用的注释具有误导性。字面量被保留和重用,但在运行时创建的字符串通常不是(正如大多数堆转储所证明的那样)。
  • GStrings 也是一种不同的动物,并不是为与可变对象关联的共享绑定类型行为而设计的。我想如果你的设计需要这样的别名,最好用一个带有字符串属性和描述性名称的基本可变 bean 来表达......甚至是 AtomicReference<String>
  • 或者剪掉字符串包装器,只使用一个数组或字符列表
【解决方案4】:

在 Java 中最接近 Ruby 符号的方法是在字符串上调用 intern()。 在 Java 中,您可以拥有许多具有相同内容的 String 对象,intern 确保它为相同的内容(字符序列)返回相同的对象,因此它返回一个规范/不同的值。 因此,对于通用 Java 字符串,您必须调用 equals 方法来检查内容是否相等,而对于实习字符串,您可以简单地使用 == 运算符。

更多详情请见:https://en.wikipedia.org/wiki/String_interning

【讨论】:

    【解决方案5】:

    ruby 中的符号只是一个不可变的字符串。 java 等价物只是一个普通的String。我真的没有看到太多 ruby​​ 特定的功能,除了这个内存泄漏...

    【讨论】:

      猜你喜欢
      • 2020-06-27
      • 2013-04-18
      • 2015-10-22
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 2010-09-07
      • 2010-11-01
      • 1970-01-01
      相关资源
      最近更新 更多