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 01:46] 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.List;
 +
 final class Record { final class Record {
  
-  private final long id; +    private final long id; 
-  private final String name; +    private final String name; 
-  private final List<String> tokens;+    private final List<String> tokens
 + 
 +    public Record(long id, String name, List<String> tokens) { 
 +        this.id = id; 
 +        this.name = name; 
 + 
 +        /*  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); 
 +    } 
 + 
 +    public long getId() { 
 +        return id; 
 +    } 
 + 
 +    public String getName() { 
 +        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() { 
 +        //return new ArrayList<>(tokens); 
 +        return tokens; 
 +    } 
 + 
 +    @Override 
 +    public String toString() { 
 +        return "Record (id = " + id + ", name='" + name + '\'' + ", tokens=" + tokens + ")"; 
 +    } 
 +
 + 
 +class TestRecord { 
 + 
 +    public static void main(String[] args) { 
 +        List<String> tokens = new ArrayList<>(); 
 +        tokens.add("Token 1"); 
 +        tokens.add("Token 2");
  
-  public Record(long idString nameList<String> tokens) +        Record record = new Record(1"One", tokens); 
-    this.id = id+        System.out.println(record);
-    this.name = name; +
-    this.tokens = tokens; +
-  }+
  
-  public long getId() +        tokens.remove(0); 
-    return id+        System.out.println(record);
-  }+
  
-  public String getName() +        System.out.println(record.withName("Two"));
-    return name; +
-  }+
  
-  public List<String> getTokens() +        record.getTokens().add("Token 3"); 
-    return new ArrayList<>(tokens); +        System.out.println(record);
-  }+
  
-  @Override +    }
-  public String toString() { +
-    return "Record{"+
-        "id=" + id + +
-        ", name='" + name + '\''+
-        ", tokens=" + tokens + +
-        '}'; +
-  }+
 } }
 +</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.1680907604.txt.gz · Last modified: 2023/07/04 19:36 (external edit)