I'm not particularly well-versed in coding, just going into my 2nd year of CS courses, but what would the better way be? Storing everything in a file that is read/written to?
If it were me, I would have went all-in on one system. As an example, right now some of the species are being defined as Java enums while the new ones are stored as external XML files, and last time I checked the species loader has to manage both possibilities. That would also make it cumbersome to add additional species traits, as you'd have to know how to do it in two different ways to ensure that the legacy species were kept up-to-date.
From what I remember, this applies to quite a few of the moddable elements of the game, so the species system having two distinct loaders is only the tip of the iceberg.
Or is this on the level of Inno defining a whole new class for something like limb types instead of adding that to an existing class? In which case, does Java not have something like C++'s structures?
Java doesn't have structs, but simple classes can be more or less used for the same purpose.
Aside from the default access modifiers being different, I don't think there are too many functional differences between structs and classes in C++, which is likely why they were omitted from Java.