Enforce immutability and insertion iteration order properties of ZplCommand.parameters #20
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR is a follow-up to #18.
In #18, I described a way of eliminating the need to make
parameters
aLinkedHashMap
publicly without losing insertion iteration ordering.This PR is a bit different to how I described it, but the main change is that
ZplCommand
becomes an abstract class whose constructor accepts a list of ZPL parameters to enforce insertion ordering, andZplCommand.parameters
becomes an unmodifiable map of these parameters.Advantages
People can't accidentally do the following:
...which loses insertion ordering.
People can't be naughty and do this:
...since it now throws an
UnsupportedOperationException
. This is due to the use ofjava.util.Collections.unmodifiableMap
.Drawbacks
ZplCommand
is changed in a backwards-incompatible way, but this is probably fine as we're still on version 0.x.java.util.Collections.unmodifiableMap
is necessary. On one hand, it guards against Kotlin's read-only collections being able to be casted into mutable collections. On the other hand, it's Java-specific (though we're targeting JVM/Android anyway) and it's not idiomatic in Kotlin.Thoughts?