这是我的问题(大图)。我有一个使用大型和复杂(我的意思是包含多层嵌套结构)Matlab 结构的项目。这是可以预见的缓慢(尤其是在尝试加载/保存时)。我试图通过将其中一些结构转换为 Java 对象来改进运行时。问题是这些 Matlab 结构中的数据在很多地方都可以访问,因此任何需要重写访问语法的东西都是禁止的。因此,我需要 Java 对象尽可能地模仿 Matlab 结构的行为,特别是在访问存储在其中的值时(这些值只设置在一个地方,因此 java 中缺少运算符重载来设置不是考虑因素)。
我遇到的问题(小图)在于从这些结构的数组中访问数据。例如,
person(1)
.age = 20
.name
.first = 'John'
.last = 'Smith
person(2)
.age = 25
.name
.first = 'Jane'
.last = 'Doe'
Matlab 将允许您执行以下操作,
>>age = [person(1:2).age]
age =
20 25
试图用Java完成同样的事情,
>>jperson = javaArray('myMatlab.Person', 2);
>>jperson(1) = Person(20, Name('John', 'Smith'));
>>jperson(2) = Person(25, Name('Jane', 'Doe'));
>>age = [jperson(1:2).age]
??? No appropriate method or public field age for class myMatlab.Person[]
有什么方法可以让 Java 对象模仿这种行为? 我的第一个想法是简单地扩展Person[] 类,但这似乎是不可能的,因为它是最终的。我的第二种方法是创建一个包含 Person 的 ArrayList 的包装类,但是我不相信这会起作用,因为调用
wrappedPerson(1:2)
将被解释为对 WrappedPerson 类的构造函数调用或尝试访问不存在的 WrappedPerson 数组的元素(因为 java 不会让我覆盖 "()" 运算符)。任何见解将不胜感激。
我用于我的 java 类的代码是
public class Person {
int _age;
ArrayList<Name> _names;
public Person(int age, Name name) {
_age = age;
_names.add(name);
}
public int age() {return _age;}
public void age(int age) {_age = age;}
public Name[] name() {return _names.toArray(new Name[0]);}
public void name(Name name) { _names.add(name);}
}
public class Name {
String _first;
String _last;
public Name(String first, String last) {
_first = first;
_last = last;
}
public int first() {return _first;}
public void first(String firstName) {_first = firstName;}
public int last() {return _last;}
public void last(String lastName) {_last = lastName;}
}