To be clear, you are then OK with simply adding the two put() methods to
CSVRecord? Option 1 in my eariler message.

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