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
Last revisionBoth sides next revision
java:immutable-objects [2023/04/08 01:46] odeftajava:immutable-objects [2023/04/08 02:38] odefta
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.txt · Last modified: 2023/07/04 19:36 by 127.0.0.1