On Fri, Aug 18, 2017 at 3:38 PM, Gilles <gil...@harfang.homelinux.org>
wrote:

> On Fri, 18 Aug 2017 13:21:45 -0600, Gary Gregory wrote:
>
>> On Fri, Aug 18, 2017 at 12:50 PM, Gilles <gil...@harfang.homelinux.org>
>> wrote:
>>
>> On Fri, 18 Aug 2017 12:41:01 -0600, Gary Gregory wrote:
>>>
>>> On Wed, Aug 16, 2017 at 6:28 PM, Gilles <gil...@harfang.homelinux.org>
>>>> wrote:
>>>>
>>>> On Wed, 16 Aug 2017 11:27:53 -0600, Gary Gregory wrote:
>>>>
>>>>>
>>>>> Let's summarize the options:
>>>>>
>>>>>>
>>>>>> 0) do nothing
>>>>>> 1) Add two put methods to CVSRecord making the class mutable
>>>>>> 2) Add a "mutableRecord" boolean option to CVSRecord and CSVFormat
>>>>>> such
>>>>>> that a new boolean in CVSRecord allow method from 1) above to either
>>>>>> work
>>>>>> or throw an exception.
>>>>>> 3) Add a "mutableRecord" boolean option to CVSRecord and CSVFormat
>>>>>> such
>>>>>> that subclass of CVSRecord called CVSMutableRecord is created which
>>>>>> contains two new put methods
>>>>>>
>>>>>> What else?
>>>>>>
>>>>>>
>>>>>> 4) The factory method:
>>>>>  /**
>>>>>   * @param orig Original to be copied.
>>>>>   * @param replace Fields to be replaced.
>>>>>   * @return a copy of "orig", except for the fields in "replace".
>>>>>   */
>>>>>  public static CSVRecord createRecord(CSVRecord orig,
>>>>>                                       Pair<Integer, String> ...
>>>>> replace)
>>>>>
>>>>> Could also be:
>>>>>  public static CSVRecord createRecord(CSVRecord orig,
>>>>>                                       int[] replaceIndices,
>>>>>                                       String[] replaceValues)
>>>>>
>>>>>
>>>>
>>>> To me, that feels like bending over backwards and hard to very ugly to
>>>> use,
>>>> building an array of ints, building an array of Strings. Yikes. But, hey
>>>> that's just me.
>>>>
>>>>
>>> What about the "Pair" alternative above?
>>>
>>> Another alternative would be to have a "CSVRecordBuilder" (with "put"
>>> methods):
>>> ---CUT---
>>> CSVRecord rec = readRecord(source);
>>> rec = new CSVRecordBuilder(rec).put(1, "Change").put(4, "this").build();
>>> ---CUT---
>>>
>>>
>> For my money, the above is convoluted for no reason from a user's POV,
>>
>
> I surely agree that the "builder" approach is less obvious
> than adding methods as the need seems to arise.
> But the part "for no reason" is simply not true.
>
> My opinion is that a library is more useful if it limits
> the number of ways one can shoot one's foot. YMMV. :-)
>
> What are the consequences in various use-cases?
> Is mutability or immutability useful in selected cases?
> And from there, how to modify the design to gracefully
> handle all of them?
>
> Assuming that you want to define a mutable class for
> some of those cases, it might make sense to provide
> a factory to create an immutable instance:
>
> public class CSVRecord {
>
>   /** Deep copy constructor. */
>   public CSVRecord(CSVRecord rec) { /* ... */ }
>
>   public void put(int i, String s) { /* ... */ }
>
>   /** Create an immutable copy. */
>   public CSVRecord createImmutable() {
>     return new CSVRecord(this) {
>       public void put(int i, String s) {
>         throw new UnsupportedOperationException();
>       }
>     }
>   }
> }
>
> That way, in the new release, users that relied on the
> immutable character of "CSVRecord" can at least modify
> their code at the (hopefully few) right places and still
> maintain consistency.


I did something like that in the branch CSV-216 but that tweaks a lot of
code and not every one liked that.

Gary

>
>
> Gilles
>
> again compared to the simple:
>>
>> rec.put(1, "Change");
>> rec.put(4, "this");
>>
>> Gary
>>
>>
>>>
>>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> For additional commands, e-mail: dev-h...@commons.apache.org
>
>

Reply via email to