[
https://issues.apache.org/jira/browse/CLI-284?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16507449#comment-16507449
]
Stephan Fuhrmann commented on CLI-284:
--------------------------------------
I've been thinking about the problem a little. The problem is that there's the
{{Option.setLongOpt()}} method. This means you can in any time in the future
set the long option. You can also set it to {{null}}, rendering all previous
checks {{(opt != null || longOpt != null)}} at construction time senseless.
The design of the {{Option}} class is the problem. It's not _immutable_, but
has two different builders interacting with it and you can build an {{Option}}
instance also yourself.
{{Options.addOption(Option)}} is the final place where you could do a
validation. But this would be _breaking the API_ because {{addOption(Option)}}
is not documented to throw an exception.
The only way I see is to _break the API_ by removing the {{setLongOpt()}}
method, extending the constructors to all have the long-version also (nullable).
I think this doesn't make sense for Commons CLI 1 and propose to _won't fix_
this bug. Any other opinions?
> Inconsistency in constraints for creating an instance of class Option using
> builder pattern or constructor
> ----------------------------------------------------------------------------------------------------------
>
> Key: CLI-284
> URL: https://issues.apache.org/jira/browse/CLI-284
> Project: Commons CLI
> Issue Type: Bug
> Reporter: Dilraj Singh
> Assignee: Bruno P. Kinoshita
> Priority: Major
>
> Builder pattern for creating an instance of class *Option* ensures that at
> least one of the representation (short and long representation) for the
> option is not null. It throws an *IllegalArgumentException* in-case program
> tries to build an instance with both the representations as null. Consider
> the following code snippet for reference.
> {code:java}
> public static void main(String[] args) {
> Option.Builder builder = Option.builder();
> Option op = builder.build();
> }
> {code}
> This piece of code fails with the following exception
> {noformat}
> Exception in thread "main" java.lang.IllegalArgumentException: Either opt or
> longOpt must be specified
> {noformat}
> But if we try to create an instance of Option by calling its constructor, It
> allows the creation with both opt and longOpt for Option as null. Consider
> the following code snippet for reference
> {code:java}
> public static void main(String[] args) {
> Option op = new Option(null, null);
> System.out.format("Short Representation: %s\n" +
> "Long Representation: %s", op.getOpt(),
> op.getLongOpt());
> }
> {code}
> Output:
> {noformat}
> Short Representation: null
> Long Representation: null
> {noformat}
> Calling a method on an instance with both opt and longOpt as null will lead
> to undesired null pointer exception. For example, calling
> {code:java}
> op.getId() {code}
> will throw a null pointer exception, thus violating the method contract.
> So as to fix this we need to make sure that whenever a constructor is invoked
> it has a non-null argument value for at least one of the Option
> representation.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)