java:immutable-objects
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| java:immutable-objects [2023/04/07 22:42] – odefta | java:immutable-objects [2023/07/04 16: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 String name; | + | private final String name; |
| - | private final List< | + | private final List< |
| - | | + | |
| - | this.id = id; | + | this.id = id; |
| - | this.name = name; | + | this.name = name; |
| - | this.tokens = tokens; | + | |
| - | } | + | |
| - | public long getId() { | + | /* This works, but: |
| - | | + | - it will always duplicate elements |
| - | } | + | - the same copy should be used also in getTokens() method. |
| + | */ | ||
| + | // | ||
| - | public String getName() { | + | /* If tokens is already unmodifiable |
| - | | + | 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); | ||
| + | } | ||
| - | | + | |
| - | return | + | return |
| - | } | + | } |
| - | @Override | + | |
| - | | + | return name; |
| - | return | + | |
| - | " | + | |
| - | | + | /** |
| - | | + | * No simple setters, return another copy of the object. |
| - | ' | + | * @param name |
| - | } | + | * @return Record |
| + | */ | ||
| + | public Record withName(String name) { | ||
| + | | ||
| + | } | ||
| + | |||
| + | public List< | ||
| + | //return new ArrayList<> | ||
| + | return tokens; | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public String toString() { | ||
| + | return | ||
| + | } | ||
| + | } | ||
| + | |||
| + | class TestRecord { | ||
| + | |||
| + | public static void main(String[] args) { | ||
| + | List< | ||
| + | | ||
| + | tokens.add(" | ||
| + | |||
| + | Record record = new Record(1, " | ||
| + | System.out.println(record); | ||
| + | |||
| + | tokens.remove(0); | ||
| + | System.out.println(record); | ||
| + | |||
| + | System.out.println(record.withName(" | ||
| + | |||
| + | record.getTokens().add(" | ||
| + | System.out.println(record); | ||
| + | |||
| + | | ||
| } | } | ||
| </ | </ | ||
| + | Output: | ||
| + | < | ||
| + | Record (id = 1, name=' | ||
| + | Record (id = 1, name=' | ||
| + | Record (id = 1, name=' | ||
| + | Exception in thread " | ||
| + | at java.base/ | ||
| + | at java.base/ | ||
| + | at ro.medjava.immutability.TestRecord.main(Record.java: | ||
| + | </ | ||
| + | |||
| + | ===== Immutable classes in JDK ===== | ||
| + | Some immutable classes from java api: | ||
| + | * java.lang.String | ||
| + | * java.lang.Integer | ||
| + | * java.io.File | ||
| + | * java.util.Locale | ||
| + | * java.awt.Font | ||
| + | * java.net.InetSocketAddress | ||
| <note tip> | <note tip> | ||
java/immutable-objects.1680907327.txt.gz · Last modified: (external edit)
