Skip to content

Commit a0bd2f3

Browse files
authored
Update 02_Use_Checked_Collections_to_Enforce_Security.md
1 parent 7b93a04 commit a0bd2f3

File tree

1 file changed

+36
-47
lines changed

1 file changed

+36
-47
lines changed

ch08/02_Use_Checked_Collections_to_Enforce_Security.md

Lines changed: 36 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -3,84 +3,73 @@
33

44
### 使用选中的集合来强化安全性
55

6-
请注意,通用类型提供的保证仅适用于没有未经检查的警告的情况。 这意味着泛型类型对于确保其他人编写的代码的安全性没有用处,因为您无法知道该代码是否在编译时引发未经检查的警告。
6+
请注意,通用类型提供的保证仅适用于没有未经检查的警告的情况。 这意味着泛型类型对于确保其他人编写的代码的安全性没有用处,因为您无法知道该代码是否在编译
7+
时引发未经检查的警告。
78

89
假设我们有一个定义订单的类,并且定义了一个经过验证的订单:
910

1011
```java
11-
class Order { ... }
12-
class AuthenticatedOrder extends Order { ... }
12+
class Order { ... }
13+
class AuthenticatedOrder extends Order { ... }
1314
```
1415

1516
接口指定订单的供应商和处理商。 在这里,供应商只需提供经过认证的订单,而处理器则处理各种订单:
1617

1718
```java
18-
interface OrderSupplier {
19-
public void addOrders(List<AuthenticatedOrder> orders);
20-
}
21-
interface OrderProcessor {
22-
public void processOrders(List<? extends Order> orders);
23-
}
19+
interface OrderSupplier {
20+
public void addOrders(List<AuthenticatedOrder> orders);
21+
}
22+
interface OrderProcessor {
23+
public void processOrders(List<? extends Order> orders);
24+
}
2425
```
2526

2627
从涉及的类型中,您可能会认为以下代理保证只有经过验证的订单可以从供应商传递到处理器:
2728

2829
```java
29-
class NaiveBroker {
30-
public void connect(OrderSupplier supplier, OrderProcessor processor) {
31-
List<AuthenticatedOrder> orders =
32-
new ArrayList<AuthenticatedOrder>();
33-
supplier.addOrders(orders);
34-
processor.processOrders(orders);
35-
}
36-
}
30+
class NaiveBroker {
31+
public void connect(OrderSupplier supplier, OrderProcessor processor) {
32+
List<AuthenticatedOrder> orders =
33+
new ArrayList<AuthenticatedOrder>();
34+
supplier.addOrders(orders);
35+
processor.processOrders(orders);
36+
}
37+
}
3738
```
3839

3940
但是一个狡猾的供应商实际上可能会提供未经认证的订单:
4041

4142
```java
42-
class DeviousSupplier implements OrderSupplier {
43-
public void addOrders(List<AuthenticatedOrder> orders) {
44-
List raw = orders;
45-
Order order = new Order(); // not authenticated
46-
raw.add(order); // unchecked call
47-
}
48-
}
43+
class DeviousSupplier implements OrderSupplier {
44+
public void addOrders(List<AuthenticatedOrder> orders) {
45+
List raw = orders;
46+
Order order = new Order(); // not authenticated
47+
raw.add(order); // unchecked call
48+
}
49+
}
4950
```
5051

5152
编译这个狡猾的供应商会发出一个未经检查的警告,但是经纪人无法知道这一点。
5253

53-
无能可能导致与迂回一样多的问题。 编译时发出未经检查的警告的任何代码都可能导致类似的问题,可能仅仅是因为作者犯了一个错误。 特别是,如前一节所述,遗留代码可能会引发这样的问题。
54+
无能可能导致与迂回一样多的问题。 编译时发出未经检查的警告的任何代码都可能导致类似的问题,可能仅仅是因为作者犯了一个错误。 特别是,如前一节所述,遗留
55+
代码可能会引发这样的问题。
5456

5557
正确的解决方案是让经纪人将检查清单传递给供应商:
5658

5759
```java
58-
class WaryBroker {
59-
public void connect(OrderSupplier supplier, OrderProcessor processor) {
60-
List<AuthenticatedOrder> orders = new ArrayList<AuthenticatedOrder>();
61-
supplier.addOrders(Collections.checkedList(orders, AuthenticatedOrder.class));
62-
processor.processOrders(orders);
63-
}
64-
}
60+
class WaryBroker {
61+
public void connect(OrderSupplier supplier, OrderProcessor processor) {
62+
List<AuthenticatedOrder> orders = new ArrayList<AuthenticatedOrder>();
63+
supplier.addOrders(Collections.checkedList(orders, AuthenticatedOrder.class));
64+
processor.processOrders(orders);
65+
}
66+
}
6567
```
6668

6769
现在,如果供应商尝试将任何内容添加到非认证订单的列表中,则会引发类别强制异常。
6870

69-
选中的集合不是实施安全性的唯一技术。 如果提供订单的接口返回一个列表而不是接受一个列表,那么代理可以使用前一节中的空循环技术来确保列表只包含经过授权的订单,然后才能通过它们。 也可以使用专业化,如下一节所述,创建一个特殊类型的列表,只能包含授权订单。
71+
选中的集合不是实施安全性的唯一技术。 如果提供订单的接口返回一个列表而不是接受一个列表,那么代理可以使用前一节中的空循环技术来确保列表只包含经过授权的
72+
订单,然后才能通过它们。 也可以使用专业化,如下一节所述,创建一个特殊类型的列表,只能包含授权订单。
7073

7174
《《《 [下一节](03_Specialize_to_Create_Reifiable_Types.md) <br/>
7275
《《《 [返回首页](../README.md)
73-
74-
75-
76-
77-
78-
79-
80-
81-
82-
83-
84-
85-
86-

0 commit comments

Comments
 (0)