On Fri, Aug 18, 2017 at 11:52 AM, Gilles <gil...@harfang.homelinux.org>
wrote:

> On Fri, 18 Aug 2017 11:34:54 -0600, Gary Gregory wrote:
>
>> To be clear, you are then OK with simply adding the two put() methods to
>> CSVRecord? Option 1 in my eariler message.
>>
>
> Actually, I think that it is not OK to not acknowledge the
> breaking nature of the proposal.
> As Simon noted you might want to consider that such a change
> warrants a major release, or not if you _decide_ that the
> project never promised immutability (despite what the source
> says through self-documentation).
>
> I'm not opposing a decision to break, if that's your preferred
> option (despite the technical arguments against what I proposed
> have not been substantiated IIUC).
>
> In any cases, a mutable subclass is not a solution IMO.
>
> Not sure I'm clear enough... :-)


hm, so add the 2 put APIs and call it 2.0. That's fine with me.

Gary


>
> Gilles
>
>
> Gary
>>
>> On Fri, Aug 18, 2017 at 10:05 AM, Gilles <gil...@harfang.homelinux.org>
>> wrote:
>>
>> On Fri, 18 Aug 2017 09:36:06 -0600, Gary Gregory wrote:
>>>
>>> Please see branch CSV-216 for a KISS implementation that uses a
>>>> CSVMutableRecord subclass.
>>>>
>>>>
>>> I don't think anyone gains anything through this subclassing.
>>>
>>> A client can no longer assume that an instance of "CSVRecord" is
>>> immutable and will have to make a defensive copy or an "instanceof"
>>> check (that will be obsolete/broken whenever the hierarchy is
>>> modified).
>>>
>>> Better assume a functionally breaking change and add the methods
>>> to class "CSVRecord"...
>>>
>>> Gilles
>>>
>>>
>>>
>>> I do not believe this feature warrants creating interfaces or
>>>> framework-like code. I do not believe we need to start leaning the
>>>> JDBC-way.
>>>>
>>>> Gary
>>>>
>>>> On Thu, Aug 17, 2017 at 3:04 PM, Simon Spero <sesunc...@gmail.com>
>>>> wrote:
>>>>
>>>> On Aug 15, 2017 8:01 PM, "Gilles" <gil...@harfang.homelinux.org> wrote:
>>>>
>>>>>
>>>>> Saying that making record mutable is "breaking" is a bit unfair when we
>>>>> do
>>>>> > NOT document the mutability of the class in the first place.
>>>>> >
>>>>>
>>>>> I'm stating a fact: class is currently immutable, change would make it
>>>>> mutable; it is functionally breaking.
>>>>> I didn't say that you are forbidden to do it; just that it would be
>>>>> unwise,
>>>>> particularly if it would be to save a few bytes.
>>>>>
>>>>>
>>>>> Exactly.
>>>>>
>>>>> TL;DR. This is almost always a breaking semantic change; the safest
>>>>> ways
>>>>> of implementing it are binary breaking; it's unlikely to have a major
>>>>> performance impact; it might be better to create a new API module for
>>>>> enhancements, with current package as legacy or implementation.
>>>>>
>>>>> If a class previously exposed no mutators, adding one is usually a
>>>>> major
>>>>> change. This is especially true for final classes, but it still affects
>>>>> use
>>>>> cases where an instance is owned by another class, which may rely on
>>>>> the
>>>>> lack of mutability to avoid making defensive copies.
>>>>> Of course, a final class that has a  package-private getter  to a
>>>>> shared
>>>>> copy of its backing array could be considered to be sending mixed
>>>>> messages...
>>>>>
>>>>> It is possible that a mutable class might have significant performance
>>>>> advantages over an immutable one beyond saving a few bytes. For
>>>>> example,
>>>>> if
>>>>> the updates are simple, and depend on the previous value of the cell,
>>>>> then
>>>>> a mutable version might have better cache behavior. If there's other
>>>>> sources of cache pressure this might have a higher than expected
>>>>> impact.
>>>>> The costs of copying the original values might also be relatively
>>>>> significant.
>>>>>
>>>>> For an ETL use case these issues are unlikely to be limiting factors;
>>>>> for a
>>>>> start, there's a non-zero chance that a  CSVRecord was extracted  by
>>>>> parsing a CSV file. Also a transform will require conversion to some
>>>>> sort
>>>>> of Number (or String allocation).
>>>>>
>>>>> The current API doesn't easily support adding alternate implementations
>>>>> of
>>>>> the relevant types. Implementation classes are final, and important
>>>>> return
>>>>> types are concrete.
>>>>>
>>>>> One solution might be to treat the current code as almost an
>>>>> implementation
>>>>> module, define a separate API module, and add extra interfaces and
>>>>> alternate  implementations to support  the target use case (mutable
>>>>> records, streams, reactivex, transform functions or what have you).
>>>>>
>>>>> Simon
>>>>>
>>>>>
>>>>>
>>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> For additional commands, e-mail: dev-h...@commons.apache.org
>
>

Reply via email to