cayenne-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Tony Giaccone <tgiacc...@gmail.com>
Subject Re: Copy/Clone Mutable Objects?
Date Mon, 08 Sep 2014 17:07:47 GMT
Mike,

This "problem" is not unique to Cayenne. it's the nature of Java. Anytime you hold on to a
reference to a mutable value and other objects have references to that object any change in
one reference is reflected in all references. If you don't understand that java behavior 
your life is going to be painful. I don't think this is a Cayenne problem as much as a Java
problem.

Tony

> On Sep 8, 2014, at 10:30 AM, Michael Gentry <mgentry@masslight.net> wrote:
> 
> I was thinking in CDO's writeProperty() we could test if a date or array
> and clone them if true.  Otherwise, just advertise that we don't clone
> mutable values as a limitation of the framework.  I suspect for most use
> cases this is a reasonable limitation.
> 
> 
>> On Mon, Sep 8, 2014 at 10:20 AM, John Huss <johnthuss@gmail.com> wrote:
>> 
>> The answer is to use immutable data types.  Unfortunately that takes some
>> work in Java.  Anyway, it's not that difficult to write a Cayenne
>> ExtendedType subclass to allow using custom attribute types that are
>> immutable, if you can find or create an immutable data type that fits your
>> needs.  For byte[] you could use ImmutableList in guava:
>> 
>> 
>> http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableList.html
>> 
>> 
>> 
>> On Mon, Sep 8, 2014 at 7:54 AM, Michael Gentry <mgentry@masslight.net>
>> wrote:
>> 
>>> I think everyone is getting wrapped up around Dates.  My general question
>>> was about mutable types.
>>> 
>>>  byte[] data = { 1, 2, 3, 4 };
>>>  person.setData(data);
>>>  data[0] = 5;
>>>  for (int i = 0; i < person.getData().length; i++)
>>>      System.out.println("Data[" + i + "] = " + person.getData()[i]);
>>> 
>>> Data[0] = 5
>>> 
>>> Data[1] = 2
>>> 
>>> Data[2] = 3
>>> 
>>> Data[3] = 4
>>> 
>>> Again, modifying the original value changes what is stored internally by
>>> Cayenne.
>>> 
>>> Thanks,
>>> 
>>> mrg
>>> 
>>> 
>>> On Mon, Sep 8, 2014 at 3:39 AM, Aristedes Maniatis <ari@maniatis.org>
>>> wrote:
>>> 
>>>> And https://github.com/ThreeTen/threetenbp for Java 6/7 users.
>>>> 
>>>> Ari
>>>> 
>>>> 
>>>>> On 8/09/2014 4:42pm, Andrus Adamchik wrote:
>>>>> Also Java 8 Date and Time if Java 8 is an option:
>> http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html
>>>>> 
>>>>> Andrus
>>>>> 
>>>>>> On Sep 8, 2014, at 4:17 AM, John Huss <johnthuss@gmail.com>
wrote:
>>>>>> 
>>>>>> Sure, use Joda time.
>>>>>> On Sep 6, 2014 8:15 PM, "Michael Gentry" <mgentry@masslight.net>
>>> wrote:
>>>>>> 
>>>>>>> Is that a realistic option?
>>>>>>> 
>>>>>>> 
>>>>>>> On Sat, Sep 6, 2014 at 6:55 PM, John Huss <johnthuss@gmail.com>
>>> wrote:
>>>>>>> 
>>>>>>>> My thoughts are: don't use Date.
>>>>>>>> On Sep 6, 2014 4:58 PM, "Michael Gentry" <mgentry@masslight.net>
>>>> wrote:
>>>>>>>> 
>>>>>>>>> Should Cayenne copy/clone mutable objects, such as Date?
>>>>>>>>> 
>>>>>>>>> For example, if I modify a date after setting it in a
Cayenne
>>> object
>>>>>>>>> (person), it modifies the value stored by Cayenne:
>>>>>>>>> 
>>>>>>>>> SimpleDateFormat timeFormat = new SimpleDateFormat
>> ("yyyy-MM-dd");
>>>>>>>>> Date d1 = timeFormat.parse("2014-02-01");
>>>>>>>>> person.setStartDate(d1);
>>>>>>>>> d1.setYear(2013 - 1900); // Date hackery
>>>>>>>>> System.out.println("Start Date = " + person.getStartDate());
>>>>>>>>> 
>>>>>>>>> This outputs:
>>>>>>>>> 
>>>>>>>>> Start Date = Fri Feb 01 00:00:00 EST 2013
>>>>>>>>> 
>>>>>>>>> I've never actually experienced an issue with Cayenne
not
>> copying a
>>>>>>>>> Date/etc, but was wondering your thoughts on this.
>>>>>>>>> 
>>>>>>>>> Thanks,
>>>>>>>>> 
>>>>>>>>> mrg
>>>> 
>>>> --
>>>> -------------------------->
>>>> Aristedes Maniatis
>>>> GPG fingerprint CBFB 84B4 738D 4E87 5E5C  5EFA EF6A 7D2E 3E49 102A
>> 

Mime
View raw message