我正在实践 Java 并发中的一个示例,但不明白为什么在以下代码中需要并发安全容器。
我没有看到容器“locations”的状态在构建后如何修改;因此,由于它是通过“不可修改的Map”包装器发布的,因此在我看来,普通的 HashMap 就足够了。
EG,它是并发访问的,但是map的状态只有读者访问,没有作者访问。映射中的值字段通过委托给“SafePoint”类来同步,因此虽然点是可变的,但映射中的哈希键及其关联值(对 SafePoint 实例的引用)永远不会改变。
我认为我的困惑是基于问题中集合的确切状态。
谢谢!!-麦克风
清单 4.12,实践中的 Java 并发(此清单可在此处以 .java 形式提供,也可通过 google 以章节形式提供)
/////////////开始代码
@ThreadSafe
public class PublishingVehicleTracker {
private final Map<String, SafePoint> locations;
private final Map<String, SafePoint> unmodifiableMap;
public PublishingVehicleTracker(
Map<String, SafePoint> locations) {
this.locations
= new ConcurrentHashMap<String, SafePoint>(locations);
this.unmodifiableMap
= Collections.unmodifiableMap(this.locations);
}
public Map<String, SafePoint> getLocations() {
return unmodifiableMap;
}
public SafePoint getLocation(String id) {
return locations.get(id);
}
public void setLocation(String id, int x, int y) {
if (!locations.containsKey(id))
throw …Run Code Online (Sandbox Code Playgroud) public void Foo(double d){
// when called below, d == 2^32-1
...
}
public void Bar(){
uint ui = 1;
Foo( 0 - ui );
}
Run Code Online (Sandbox Code Playgroud)
我希望0和ui都能在这里升级为签名多头.
是的,使用0字面值,在编译时可以知道转换为uint是安全的,
但我想这一切似乎都错了.至少应发出警告.
谢谢!
语言规范是否涵盖了这样的半模糊情况?
我想pydantic用于在 api 和数据存储之间处理数据(双向),因为它很好地支持我关心的几种类型,这些类型不是原生的 json-serializable。它比当前方法具有更好的读取/验证支持,但我还需要创建 json-serializabledict对象来写出。
from uuid import UUID, uuid4
from pydantic import BaseModel
class Model(BaseModel):
the_id: UUID
instance = Model(the_id=uuid4())
print("1: %s" % instance.dict()
print("2: %s" % instance.json()
Run Code Online (Sandbox Code Playgroud)
印刷
{'the_id': UUID('4108356a-556e-484b-9447-07b56a664763')}
>>> inst.json()
'{"the_id": "4108356a-556e-484b-9447-07b56a664763"}'
Run Code Online (Sandbox Code Playgroud)
我喜欢以下内容:
{"the_id": "4108356a-556e-484b-9447-07b56a664763"} # eg "json-compatible" dict
Run Code Online (Sandbox Code Playgroud)
看来,虽然pydantic拥有所有的映射,但是我找不到序列化的任何使用标准之外json〜递归编码器(json.dumps( ... default=pydantic_encoder))的pydantic/main.py。但我更愿意保留一个库来验证 raw->obj(pydantic 在这方面很棒)以及 obj->raw(dict),这样我就不必管理多个序列化映射。我想我可以实现类似于json使用编码器的东西,但这应该是一个常见的用例吗?
其他方法,例如dataclasses(builtin)+ 库,例如dataclasses_jsonschema向 提供此 ~ 序列化json-ready dict,但同样希望使用 pydantic 进行更强大的输入验证,同时保持对称。
使用扬鞭/ OpenAPI的(随后招摇,代码生成),我一直没能找到有什么区别应该是之间
这是从https://swagger.io/specification/#responsesObject获取的 (第一个示例,json格式)
"responses" : {
"200": {
"description": "a pet to be returned",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Pet"
} } } } }
Run Code Online (Sandbox Code Playgroud)
和
"responses" : {
"200": {
"description": "a pet to be returned",
"schema": {
"$ref": "#/components/schemas/Pet"
} } }
Run Code Online (Sandbox Code Playgroud)
我已将此示例放入一个简单的json swagger规范(json)中,并运行Swagger-Codegen(python,flask)来生成我的控制器和模型。Yaml似乎是首选的内部表示形式,因此当生成器运行时,它将创建一个yaml文件。
对于前者,响应类型为“无”
responses:
200:
description: "a pet to be returned"
Run Code Online (Sandbox Code Playgroud)
而后者产生了我认为我应该期望的:
responses:
200:
description: "a pet to be returned"
schema:
$ref: "#/components/schemas/Pet"
Run Code Online (Sandbox Code Playgroud)
例如,似乎使用以下语法从第一个语法中省略了模式 Content
内容是什么意思?我在示例中缺少什么,为什么Content结果没有返回Non-None返回类型和相应的模式。
请注意SwaggerCodgen:生成的代码与生成的yaml所说的完全匹配,因此在这里我没有包括任何这些细节
c# ×1
immutability ×1
java ×1
operators ×1
pydantic ×1
python ×1
python-3.x ×1
swagger ×1
yaml ×1