【问题标题】:How to run custom function in initializer list dart lang?如何在初始化列表 dart lang 中运行自定义函数?
【发布时间】:2021-08-24 18:47:29
【问题描述】:

我研究 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 和空安全?

【问题讨论】:

    标签: dart


    【解决方案1】:

    初始化器列表并不真正意味着执行任意代码。通常正确的做法是在构造函数主体中调用验证函数。这样做会在您初始化成员(并执行所有基类构造函数)之后执行它,但是:

    • 初始化成员通常不应该有副作用,所以顺序应该无关紧要。
    • 无效参数的异常通常是逻辑错误,无论如何都会使程序崩溃。

    但是,如果出于某种原因您确实必须在初始化成员之前调用您的验证函数,您可以作弊。由于初始化列表可以包含asserts,您可以添加一个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;
    }
    

    当然,asserts 可能未启用。如果您希望无条件调用您的验证函数,您可以在初始化现有成员的过程中调用一个函数:

    int checkIfValid(int x) {
      if (x < 0) {
        throw ArgumentError('Invalid value: $x');
      }
      return x;
    }
    
    class Foo {
      int x;
      
      Foo(int x)
        : x = checkIfValid(x);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多