【问题标题】:Methods in Java API for Lotus Notes returns Vector and not ArrayListLotus Notes 的 Java API 中的方法返回 Vector 而不是 ArrayList
【发布时间】:2014-11-28 18:19:09
【问题描述】:

如果我需要检索一个字段的值,我将需要使用这个函数

public java.util.Vector getItemValue(String name) throws NotesException

这个方法与 Lotus Notes Java API 中的任何其他方法一样返回 Vector 对象。在此answer 中解释了 Vector 已过时。但是这个answer 在同一个问题上让我认为使用Vector 可能是必要的。

虽然枚举更快,但它们不检查集合是否 在迭代期间进行了修改,这可能会导致问题,并且鉴于 可能会选择 Vector 进行同步 - 与服务员同步 从多个线程访问,这使得它特别有害 问题。

当我们使用 Lotus Notes Java API 时,如果我们将生成的 Vector 对象转换为 ArrayList 对象有什么问题吗?

Vector<String> vector = (Vector<String>) doc.getItemValue("somefield");
ArrayList<String> list = new ArrayList<String>(vector);

或者,一般来说,不建议进行这种转换吗?

编辑:以防万一,我不想/不需要使用Vector 对象,但来自 Lotus Notes Java API 的方法总是返回它。所以,我有两个选择:(1) 始终将 Vector 对象转换为 ArrayList 或任何其他更好的选择,或者 (2) 只使用 Vector 对象。

简而言之,我的疑问是:在这种情况下将 Vector 对象转换为 ArrayList 是否安全?

【问题讨论】:

  • Vector 的 Javadoc 中哪里说它已被弃用?它可能被一些人认为已过时,但不推荐使用它。请使用正确的术语。
  • @Lolo 已修复。感谢您的观察。

标签: java vector arraylist lotus-notes


【解决方案1】:

您可以将 Vector 转换为更现代的 Collection。但是您必须确保不使用 Java 7 功能或类。

据我所知,IBM Notes 仍然使用 IBM Java 6 VM。

泛型有点危险,因为我不确定向量中getItemValue() 返回的每个项都是字符串。

更新

我更喜欢使用Vector,因为这就是 API 工作的方式。

事实上,IBM Notes / Domino API 有点可怕。有一个wrapper for the API from openNTF

【讨论】:

  • 是的,您对 Lotus Domino/Notes 中使用的 Java 版本是正确的。为了确保不使用 Notes 不支持的功能,我只安装了 JRE 6...哇!我刚看到你的更新。这就是我要找的。谢谢。
【解决方案2】:

不要使用已弃用的Vectors。众所周知,它们的速度很慢。

如果您需要同步列表,您可以将任何列表转换为同步版本

syncList = Collections.synchronizedList(list);

【讨论】:

  • Notes 本身使用 Vector(没有泛型)。真是太糟糕了。因此,由于 API 的原因,无法使用 List。
  • @ChristianKuetbach 是的,我的意思是将它们转换为列表,然后按照 OP 的建议使用列表,然后在需要时使用同步版本。
【解决方案3】:

Vectors 已被弃用多年。除非您特别需要它的线程安全性,否则只需使用ArrayList - 它会更快。即使您确实要求您的集合是线程安全的,现代 JDK 中也有更好的选择,例如 CopyOnWriteArrayList

【讨论】:

  • IBM 安装了 IBM Java6 VM,因此无法使用更新的类或功能。
  • @ChristianKuetbach CopyOnWriteArrayList 自 java 5 以来一直可用。我已更新答案中的所有链接以指向 Java 5 的文档以消除这些问题。
猜你喜欢
  • 2012-09-03
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
相关资源
最近更新 更多