Transient fields in records

John Hendrikx hjohn at xs4all.nl
Thu Dec 22 12:37:29 UTC 2022


Hi,

I have tried googling this topic and looking through the amber-dev and 
amber-spec-experts archives, but was unable to locate anything that 
mentioned transient fields in combination with records. The JEP itself 
also makes no mention of transient fields.  The word transient seems to 
never be mentioned in combination with records anywhere...

I often enough design classes for serialization in some fashion or 
other.  One of the tools that one can use here is to use transient 
fields to store information that can be completely derived from the 
other fields.  These are used to store information that may be too large 
to store or too expensive to (re)calculate on every access.  All major 
frameworks that do serialization recognize such fields and act 
accordingly (Java serialization, Jackson, Hibernate).

However, records do not allow such fields, even though I think one of 
their primary use cases is data storage, which often will sooner or 
later involve serialization.  Now I can't imagine this was an oversight, 
so I'm curious to know if transient fields were simply left out for now, 
or that they are not allowed for other reasons.

Javac simply complains: TransientRecord.java:4: error: field declaration 
must be static

Here is the use case I had when I encountered this problem:

     public record Message( A a, B b, C c, D d) {
       public enum Type {
           A, B, C, D;
       }

       private final transient List<Type> types;   // <<< not allowed

       public Message {
           List<Type> types = new ArrayList<>();

           if(a != null) {
               types.add(Type.A);
           }
           if(b != null) {
               types.add(Type.B);
           }
           if(c != null) {
               types.add(Type.C);
           }
           if(d != null) {
               types.add(Type.D);
           }

           this.types = Collections.unmodifiableList(types);
       }

       public List<Type> getTypes() {
           return types;   // use transient field to avoid recalculation
       }
     }

--John
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-dev/attachments/20221222/2080e720/attachment.htm>


More information about the amber-dev mailing list