73 lines
1.7 KiB
Plaintext
73 lines
1.7 KiB
Plaintext
``++transient++`` fields are ignored by Java's automatic serizalization mechanisms, which means that when a object is deserialized, those fields will be set to their default values.
|
|
|
|
|
|
``++transient++`` fields that are referenced in multiple places in a class seem to play a significant role in that class. Allowing such significant fields to be left in a default state after deserialization may not be the best course, so they should probably be set in either a ``++readObject()++`` or ``++readResolve()++`` method.
|
|
|
|
|
|
== Noncompliant Code Example
|
|
|
|
Using the default threshold of 3:
|
|
|
|
[source,java]
|
|
----
|
|
class Fruit implements Serializable {
|
|
private transient Seed seed;
|
|
|
|
public Fruit (Seed seed) {
|
|
this.seed = seed; // 1st set
|
|
}
|
|
public void setSeed (Seed seed) {
|
|
this.seed = seed; // 2nd set
|
|
}
|
|
public Seed getSeed() {
|
|
return seed; // not counted; read, not write.
|
|
}
|
|
|
|
public void sprout () {
|
|
this.seed = new GerminatedSeed(); // Noncompliant; 3rd write
|
|
//...
|
|
}
|
|
}
|
|
----
|
|
|
|
|
|
== Compliant Solution
|
|
|
|
[source,java]
|
|
----
|
|
class Fruit implements Serializable {
|
|
private transient Seed seed;
|
|
|
|
public Fruit (Seed seed) {
|
|
this.seed = seed; // 1st reference
|
|
}
|
|
public void setSeed (Seed seed)
|
|
this.seed = seed; // 2nd reference
|
|
}
|
|
public Seed getSeed() {
|
|
return seed; // not counted; read, not write.
|
|
}
|
|
|
|
public void sprout () {
|
|
this.seed = new GerminatedSeed(); // Noncompliant; 3rd write
|
|
//...
|
|
}
|
|
|
|
protected Object readResolve() throws ObjectStreamException {
|
|
// ...
|
|
}
|
|
}
|
|
----
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
include::message.adoc[]
|
|
|
|
include::parameters.adoc[]
|
|
|
|
endif::env-github,rspecator-view[]
|