我研究 dart 语言,我想为带有值验证的 Uuid 编写一个值对象模型。
import 'package:uuid/uuid.dart' as uuidLibrary;
class Uuid {
String value;
Uuid (String value) : uuidLibrary.Uuid.isValidOrThrow(fromString: uuid), this.value = value;
}
但是我的静态代码分析器告诉我初始化程序列表是错误的:uuidLibrary.Uuid.isValidOrThrow(fromString: uuid)
。
静态方法isValidOrThrow
已经实现了我需要的所有检查,我想在赋值之前进行此检查;
继续使用 isValidOrThrow
和 null 安全性,我该如何做到这一点?
最佳答案
初始化列表并不真正意味着执行任意代码。通常正确的做法是在构造函数主体中调用验证函数。这样做会在初始化成员(并执行所有基类构造函数)之后执行它,但是:
- 初始化成员通常不会产生副作用,因此顺序并不重要。
- 无效参数引发的异常通常是逻辑错误,无论如何都会导致程序崩溃。
但是,如果由于某种原因您确实必须在初始化成员之前调用验证函数,那么您可以作弊。由于初始值设定项列表可以包含 assert
,因此您可以添加一个 assert
来执行您想要的任何函数:
bool myValidationFunction(int x) {
return x >= 0;
}
class Foo {
int x;
Foo(int x)
: assert(myValidationFunction(x)),
x = x;
}
或者,如果您希望验证函数抛出异常而不是返回 bool
:
void throwIfInvalid(int x) {
if (x < 0) {
throw ArgumentError('Invalid value: $x');
}
}
class Foo {
int x;
Foo(int x)
: assert(() { throwIfInvalid(x); return true; }),
x = x;
}
当然,assert
可能未启用。如果您希望无条件地调用验证函数,您可以在初始化现有成员的过程中调用一个函数:
int checkIfValid(int x) {
if (x < 0) {
throw ArgumentError('Invalid value: $x');
}
return x;
}
class Foo {
int x;
Foo(int x)
: x = checkIfValid(x);
}
关于dart - 如何在初始化列表 dart lang 中运行自定义函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68912626/