如何有效地为MT20x消息制作包装器

我计划为Swift MT203,MT204消息制作一个包装器。

消息结构如下,

MT203 – 2强制序列,其中第一个存在一次,第二个存在两到十次,每个序列可以包含必填字段和可选字段。

MT204 – 2强制序列,其中第一个存在一次,第二个可以存在多次,每个序列可以包含必填字段和可选字段。

[参考MT203和MT204]

  1. https://www2.swift.com/knowledgecentre/publications/usgf_20180720/1.0?topic=finmt203.htm
  2. https://www2.swift.com/knowledgecentre/publications/usgf_20180720/1.0?topic=finmt204.htm

在每种情况下,哪种数据结构最好用于存储第二个序列,

我更喜欢,Array例如MT203 ,因为我知道第二个序列的最大大小但是对于MT204我很困惑,从arrays和数组列表中选择哪个更好。

在解包时,我们必须连续获取字段,但并非所有字段都是第二个序列必需的。

[如果Array的第一个选择无效,也要做评论]

我认为你对这两种数据结构都做得很好。

话虽如此,您可能需要考虑一些事情:您可以创建一个ArrayList(与任何其他列表一样)不可变。 这样可以防止对内容进行不必要的修改。 当您传递这些消息对象并希望阻止其他人意外修改消息时,这可能非常有趣。 有许多方法可以使列表不可变 – 例如Collections.immutableList(myArrayList)或Guava的ImmutableList.copyOf(myArrayList)

话虽如此,我认为有更重要的考虑因素而不是列表特征的数组:

首先,我会考虑让它们都使用相同的数据结构 – 特别是如果两个消息都在代码库的同一部分中使用,如果一个消息类型是一个数组,它将会非常混乱,而另一个是一个数组名单。 这可能最终成为后面的痛苦,因为两条消息都必须以不同的方式处理。 例如,如果您想记录消息 – 您必须对列表与数组进行不同的操作。

其次,我建议将这些消息中的每一个建模为一个类。 该类将(显然)在内部使用数组或列表来存储消息数据,但它也会对消息内容提供更高级别的语义访问。

假设您想要MTS203的ValueDate(字段索引1):您总是需要为此调用dateFormat.parse(message [1]) – 并且每个人都需要记住索引1是什么以及如何将日期字符串解析为一个实际的日期对象。 如果你有这样一个类:

 class MultipleGeneralFinancialInstitutionTransfer { private List messageData; /** constructor... */ public Date getValueDate() { return parseDate(messageData.get(1)); // imagine parse date being a method to parse the actual format } } 

使用该消息会更方便 – 没有人需要记住该消息的实际格式。

I.大小:Java中的数组大小是固定的。 创建后我们无法更改数组的大小。 ArrayList的大小是动态的。 当我们向ArrayList添加元素时,它的容量会自动增加。

II。 性能:在Java Array和ArrayList中为不同的操作提供不同的性能。

add()或get():向数组或ArrayList对象添加元素或从中检索元素具有类似的性能。 这些是恒定时间操作。

resize():自动调整ArrayList的大小会降低性能。 ArrayList在内部由Array支持。 在resize()中,临时数组用于将元素从旧数组复制到新数组。

III。 基元:数组既可以包含基本数据类型,也可以包含对象。 但ArrayList不能包含原始数据类型。 它只包含对象。

IV。 迭代器:在ArrayList中,我们使用Iterator对象来遍历元素。 我们使用for循环来迭代数组中的元素。

V.类型安全性:Java通过使用generics帮助确保ArrayList中元素的类型安全性。 Array可以包含相同类型的classe对象。 如果我们尝试在Array中存储不同的数据类型对象,则会抛出ArrayStoreException。

VI。 长度:ArrayList的大小可以通过size()方法获得。 每个数组对象都有长度变量,与数组的长度/大小相同。

七。 添加元素:在ArrayList中,我们可以使用add()方法添加对象。 在数组赋值运算符中用于添加元素。

八。 多维:arrays可以是多维的。 ArrayList始终是单维的

现在您可以根据自己的需要选择哪种更适合您