ΠΠΎΡΠ»Π΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ
ΡΠΈΡΠΊΠΎΠ² ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ (ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΡ ΠΈΠ»ΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΡ), ΠΌΡ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠΌΠΎΠ³ΡΡ Π½Π°ΠΌ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ Π²ΡΡΠ΅ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· ΡΡΠΈΡ
ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΉ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ Π΄Π΅Π»ΠΈΡΡΡΡ ΠΈΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠ΅ ΠΈ stateless ΠΎΠ±ΡΠ΅ΠΊΡΡ. ΠΡΡΠ³ΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π±ΡΠ΄ΡΡ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°ΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
ΡΠ°Π·Π½ΡΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ, ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠ°.
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΡΠ΅ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠ΅ ΠΊΠΎΠ΄Ρ Π½Π° Π³ΠΈΡΡ
Π°Π±Π΅.
1. ΠΠ΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ
ΠΠ΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈΠΌΠ΅ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ (ΠΈΠΌΠ΅ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°), Π½ΠΎ ΠΎΠ½ΠΎ Π·Π°Π΄Π°Π½ΠΎ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π±ΡΠ» ΡΠΎΠ·Π΄Π°Π½ ΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ.
Π₯ΠΎΡΡ ΠΏΠΎΡΠΎΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΡΠ΅ΡΠ΅Π΄ΠΎΠ²Π°ΡΡΡΡ, ΠΎΠ±ΡΠ΅ΠΊΡ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ ΠΎΠ΄Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ΅ ΠΏΠΎΠ»Ρ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ, Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΠ·-Π·Π° ΡΡΠΎΠ³ΠΎ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ ΠΏΠΎΡΠΎΠΊ ΠΏΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΡΡΡΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ.
ΠΠ»Π°ΡΡ Product Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ ΠΊΠ»Π°ΡΡ. ΠΠ½ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅Ρ Π²ΡΠ΅ ΡΠ²ΠΎΠΈ ΠΏΠΎΠ»Ρ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ ΠΈ Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π½ΠΈΡ
Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ:
public final class Product {
private final String id;
private final String name;
private final double price;
public Product(String id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
public String getId() {
return this.id;
}
public String getName() {
return this.name;
}
public double getPrice() {
return this.price;
}
public String toString() {
return new StringBuilder(this.id).append("-").append(this.name)
.append(" (").append(this.price).append(")").toString();
}
public boolean equals(Object x) {
if (this == x) return true;
if (x == null) return false;
if (this.getClass() != x.getClass()) return false;
Product that = (Product) x;
if (!this.id.equals(that.id)) return false;
if (!this.name.equals(that.name)) return false;
if (this.price != that.price) return false;
return true;
}
public int hashCode() {
int hash = 17;
hash = 31 * hash + this.getId().hashCode();
hash = 31 * hash + this.getName().hashCode();
hash = 31 * hash + ((Double) this.getPrice()).hashCode();
return hash;
}
}
Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΡΠ»ΡΡΠ°ΡΡ
Π±ΡΠ΄Π΅Ρ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΠΎΠ»Ρ final. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠ»Π°ΡΡ MutableProduct Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΌ, Ρ
ΠΎΡΡ Π²ΡΠ΅ ΠΏΠΎΠ»Ρ final:
public final class MutableProduct {
private final String id;
private final String name;
private final double price;
private final List categories = new ArrayList<>();
public MutableProduct(String id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
this.categories.add("A");
this.categories.add("B");
this.categories.add("C");
}
public String getId() {
return this.id;
}
public String getName() {
return this.name;
}
public double getPrice() {
return this.price;
}
public List getCategories() {
return this.categories;
}
public List getCategoriesUnmodifiable() {
return Collections.unmodifiableList(categories);
}
public String toString() {
return new StringBuilder(this.id).append("-").append(this.name)
.append(" (").append(this.price).append(")").toString();
}
}
ΠΠΎΡΠ΅ΠΌΡ ΠΊΠ»Π°ΡΡ Π²ΡΡΠ΅ Π½Π΅ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΉ? ΠΡΠΈΡΠΈΠ½Π° Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΌΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΡΠ»ΠΊΡ ΠΈΠ· ΠΊΠ»Π°ΡΡΠ°. ΠΠΎΠ»Π΅ βcategoriesβ β ΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠ°Ρ ΡΡΡΠ»ΠΊΠ°, ΡΠ°ΠΊ ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΅Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π΅Π΅. ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ ΡΡΠΎ, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
public static void main(String[] args) {
MutableProduct p = new MutableProduct("1", "a product", 43.00);
System.out.println("Product categories");
for (String c : p.getCategories()) System.out.println(c);
p.getCategories().remove(0);
System.out.println("\nModified Product categories");
for (String c : p.getCategories()) System.out.println(c);
}
Π Π²ΡΠ²ΠΎΠ΄ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ:
Product categories
A
B
C
Modified Product categories
B
C
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΠ»Π΅ βcategoriesβ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΠ΅ ΠΈ Π±ΡΠ»ΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΠΈΠ· ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» ΡΡΠΎΡ ΡΠΏΠΈΡΠΎΠΊ. ΠΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΡΠΌ, Π±ΡΠ» ΠΈΠ·ΠΌΠ΅Π½Π΅Π½, ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π½ΠΎΠ²ΠΎΠΌΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ.
ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠΏΠΈΡΠΊΠ°, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ°:
public List getCategoriesUnmodifiable() {
return Collections.unmodifiableList(categories);
}
2. Stateless ΠΎΠ±ΡΠ΅ΠΊΡΡ
Stateless ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΏΠΎΡ
ΠΎΠΆΠΈ Π½Π° Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, Π½ΠΎ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½ΠΈ Π½Π΅ ΠΈΠΌΠ΅ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ, Π΄Π°ΠΆΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ. ΠΠΎΠ³Π΄Π° ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ²Π»ΡΠ΅ΡΡΡ stateless-ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ, ΠΎΠ½ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΡ
ΡΠ°Π½ΡΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ, ΡΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ²Π»ΠΈΡΡΡ Π½Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π²ΡΠ·ΡΠ²Π°Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΠΎ ΡΡΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅ stateless ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΏΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΡΡΡΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½Ρ.
ΠΠ»Π°ΡΡ ProductHandler ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². ΠΠ½ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π°Π΄ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ Product, ΠΈ ΠΎΠ½ Π½Π΅ Ρ
ΡΠ°Π½ΠΈΡ Π½ΠΈΠΊΠ°ΠΊΠΈΡ
Π΄Π°Π½Π½ΡΡ
ΠΌΠ΅ΠΆΠ΄Ρ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ
Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΈΠ»ΠΈ Π»ΡΠ±ΡΡ
Ρ
ΡΠ°Π½ΠΈΠΌΡΡ
Π΄Π°Π½Π½ΡΡ
:
public class ProductHandler {
private static final int DISCOUNT = 90;
public Product applyDiscount(Product p) {
double finalPrice = p.getPrice() * DISCOUNT / 100;
return new Product(p.getId(), p.getName(), finalPrice);
}
public double sumCart(List cart) {
double total = 0.0;
for (Product p : cart.toArray(new Product[0])) total += p.getPrice();
return total;
}
}
Π ΠΌΠ΅ΡΠΎΠ΄Π΅ sumCart ProductHandler ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΡΠΏΠΈΡΠΎΠΊ Product Π² ΠΌΠ°ΡΡΠΈΠ² Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΡΠΈΠΊΠ»Π΅ for-each Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ° Π²ΡΠ΅Ρ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ². Π‘ΠΏΠΈΡΠΎΠΊ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠ² Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌ ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ConcurrentModificationException, Π΅ΡΠ»ΠΈ Π±ΡΠ΄ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ. Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π²Π°ΡΠΈΡ
ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠ΅ΠΉ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ±ΡΠ°ΡΡ Π΄ΡΡΠ³ΡΡ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ.
3. ΠΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠ°
ΠΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠ° β ΡΡΠΎ ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π² ΡΠ°ΠΌΠΊΠ°Ρ
ΠΏΠΎΡΠΎΠΊΠ°. ΠΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ Π½Π΅ Π²ΠΈΠ΄ΡΡ ΠΈΡ
ΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡ ΠΈΡ
.
ΠΠ΅ΡΠ²ΡΠΉ ΡΠΈΠΏ β ΡΡΠΎ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅. Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ total Ρ
ΡΠ°Π½ΠΈΡΡΡ Π² ΡΡΠ΅ΠΊΠ΅ ΠΏΠΎΡΠΎΠΊΠ°:
public double sumCart(List cart) {
double total = 0.0;
for (Product p : cart.toArray(new Product[0])) total += p.getPrice();
return total;
}
ΠΡΠΎΡΡΠΎ ΠΈΠΌΠ΅ΠΉΡΠ΅ Π² Π²ΠΈΠ΄Ρ, ΡΡΠΎ Π΅ΡΠ»ΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π²Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ ΡΡΡΠ»ΠΊΡ ΠΈ Π²Π΅ΡΠ½Π΅ΡΠ΅ Π΅Π΅, ΠΎΠ½Π° ΠΏΠΎΠΊΠΈΠ½Π΅Ρ ΡΠ²ΠΎΠΈ Π³ΡΠ°Π½ΠΈΡΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π΅ Π·Π½Π°ΡΡ Π³Π΄Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½Π½Π°Ρ ΡΡΡΠ»ΠΊΠ° Π±ΡΠ»Π° ΡΠΎΠ·Π΄Π°Π½Π°. ΠΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ sumCart ΠΌΠΎΠ³ Ρ
ΡΠ°Π½ΠΈΡΡ Π΅Π³ΠΎ Π² ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΠΏΠΎΠ»Π΅ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ Π΅ΠΌΡ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ ΡΠ°Π·Π½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ.
ΠΡΠΎΡΠΎΠΉ ΡΠΈΠΏ β ΡΡΠΎ ΠΊΠ»Π°ΡΡ ThreadLocal. ΠΡΠΎΡ ΠΊΠ»Π°ΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΠ΅ Ρ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. ΠΠ½Π°ΡΠ΅Π½ΠΈΡ, ΡΠΎΡ
ΡΠ°Π½Π΅Π½Π½ΡΠ΅ Π² ThreadLocal, Π΄ΠΎΡΡΡΠΏΠ½Ρ Π»ΡΠ±ΠΎΠΌΡ ΠΊΠΎΠ΄Ρ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΡΠΎΠΊΠ΅.
ΠΠ»Π°ΡΡ ClientRequestId ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ThreadLocale ΠΊΠ»Π°ΡΡΠ°:
public class ClientRequestId {
private static final ThreadLocal id = new ThreadLocal() {
@Override
protected String initialValue() {
return UUID.randomUUID().toString();
}
};
public static String get() {
return id.get();
}
}
ΠΠ»Π°ΡΡ ProductHandlerThreadLocal ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ClientRequestId, ΡΡΠΎΠ±Ρ Π²Π΅ΡΠ½ΡΡΡ ΡΠΎΡ ΠΆΠ΅ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΡΠΎΠΊΠ΅:
public class ProductHandlerThreadLocal {
//Same methods as in ProductHandler class
public String generateOrderId() {
return ClientRequestId.get();
}
}
ΠΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° main Π²ΡΠ²ΠΎΠ΄ Π½Π° ΠΊΠΎΠ½ΡΠΎΠ»Ρ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
T1 - 23dccaa2-8f34-43ec-bbfa-01cec5df3258
T2 - 936d0d9d-b507-46c0-a264-4b51ac3f527d
T2 - 936d0d9d-b507-46c0-a264-4b51ac3f527d
T3 - 126b8359-3bcc-46b9-859a-d305aff22c7e
...
ΠΡΠ»ΠΈ Π²Ρ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ThreadLocale, Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°Π±ΠΎΡΠΈΡΡΡΡ ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΡΠΈΡΠΊΠ°Ρ
ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ² (ΠΊΠ°ΠΊ Π² ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ
). ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΠ΅ΡΠΊΠΈ ΠΏΠ°ΠΌΡΡΠΈ ΠΈΠ»ΠΈ ΡΡΠ΅ΡΠΊΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π·Π°ΠΏΡΠΎΡΠ°ΠΌΠΈ. Π― Π½Π΅ Π±ΡΠ΄Ρ ΡΠΈΠ»ΡΠ½ΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΡΡΡΡ ΠΏΠΎ ΡΡΠΎΠΌΡ ΠΏΠΎΠ²ΠΎΠ΄Ρ Ρ.ΠΊ. ΡΡΠ°ΡΡΡ βΠΠ°ΠΊ Π²ΡΡΡΡΠ΅Π»ΠΈΡΡ ΡΠ΅Π±Π΅ Π² Π½ΠΎΠ³Ρ Ρ ThreadLocaleβ Ρ
ΠΎΡΠΎΡΠΎ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΠΊΠ°ΠΊ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΡΡΠΈΡΡΡΡ.
4. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ
ΠΡΡΠ³ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ β ΡΠ΅ΡΠ΅Π· ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ. ΠΡΠ»ΠΈ ΠΌΡ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π²ΡΠ΅ Π΄ΠΎΡΡΡΠΏΡ ΠΊ ΡΡΡΠ»ΠΊΠ΅, ΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΠΎΡΠΎΠΊ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ Π½Π΅ΠΌΡ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΡ ΠΎΠ±ΡΡΠ΄ΠΈΠΌ ΡΡΠΎ Π² Π±ΡΠ΄ΡΡΠΈΡ
ΠΏΠΎΡΡΠ°Ρ
.
5. ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΡ
ΡΡΡΠΎΠΈΡΡ ΠΏΡΠΎΡΡΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ. ΠΠ°ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠ΄Π½Π΅ΠΉ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ, Π΅ΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ. Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, Π΅ΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π»ΠΈΠ±ΠΎ Π½Π΅ ΠΈΠΌΠ΅ΡΡ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡΡΡΡ ΠΎ Π΄ΠΎΡΡΡΠΏΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π² ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ.
ΠΡΠΈΠ³ΠΈΠ½Π°Π» ΡΡΡ.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄!