User Tools

Site Tools


java:immutable-objects

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:immutable-objects [2023/04/08 02:16] odeftajava:immutable-objects [2023/07/04 19:36] (current) – external edit 127.0.0.1
Line 23: Line 23:
  
 ===== Example of immutable class ===== ===== Example of immutable class =====
- 
 <code java> <code java>
 import java.util.ArrayList; import java.util.ArrayList;
Line 37: Line 36:
         this.id = id;         this.id = id;
         this.name = name;         this.name = name;
-        //this.tokens = new ArrayList<>(tokens); //this works, but it will always duplicate elements + 
-        this.tokens = List.copyOf(tokens); //if tokens is already unmodifiable (for ex. came from List.of) it will not duplicate elements.+        /*  This works, but
 +         it will always duplicate elements 
 +         - the same copy should be used also in getTokens() method. 
 +        */ 
 +        //this.tokens = new ArrayList<>(tokens); 
 + 
 +        /*  If tokens is already unmodifiable (for ex. was formed using List.of)
 +            then it will not duplicate elements. 
 +            Also, it will prevent the tokens to be modified 
 +            (it will throw java.lang.UnsupportedOperationException). 
 +         */ 
 +        this.tokens = List.copyOf(tokens);
     }     }
  
Line 47: Line 57:
     public String getName() {     public String getName() {
         return name;         return name;
 +    }
 +
 +    /**
 +     * No simple setters, return another copy of the object.
 +     * @param name
 +     * @return Record
 +     */
 +    public Record withName(String name) {
 +        return new Record(id, name, tokens);
     }     }
  
     public List<String> getTokens() {     public List<String> getTokens() {
 +        //return new ArrayList<>(tokens);
         return tokens;         return tokens;
     }     }
Line 55: Line 75:
     @Override     @Override
     public String toString() {     public String toString() {
-        return "Record (id = " + id + ", name='" + name + '\'' + ", tokens=" + tokens + ')';+        return "Record (id = " + id + ", name='" + name + '\'' + ", tokens=" + tokens + ")";
     }     }
 } }
Line 70: Line 90:
  
         tokens.remove(0);         tokens.remove(0);
 +        System.out.println(record);
  
 +        System.out.println(record.withName("Two"));
 +
 +        record.getTokens().add("Token 3");
         System.out.println(record);         System.out.println(record);
 +
     }     }
 } }
 +</code>
 +Output:
 +<code>
 +Record (id = 1, name='One', tokens=[Token 1, Token 2])
 +Record (id = 1, name='One', tokens=[Token 1, Token 2])
 +Record (id = 1, name='Two', tokens=[Token 1, Token 2])
 +Exception in thread "main" java.lang.UnsupportedOperationException
 + at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:71)
 + at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.add(ImmutableCollections.java:75)
 + at ro.medjava.immutability.TestRecord.main(Record.java:65)
 </code> </code>
  
java/immutable-objects.1680909370.txt.gz · Last modified: 2023/07/04 19:36 (external edit)