【问题标题】:Dart private arrayDart 私有数组
【发布时间】:2020-03-07 14:18:41
【问题描述】:

在 Dart 中,我有一个像这样的类,它在 getter/setter 后面保护 _x,这使我可以控制对 _x 的更改:

//in a.dart
class A {
  int _x;
  int get x => _x;
  set x(int value) {
    bool validation_ok=true;
    //do some validation/processing
    if (validation_ok) {
      _x = value;
      //perform side effects that should happen every time _x changes e.g. save to SharedPreferences
      print('Validated $value and side effects performed');
    }
  }
}
//in amain.dart
import 'a.dart';
void main() {
  A a = A();
  a.x = 5; //if validation successful stores 5 to _x and performs side effects
  print(a.x); //prints 'Validated 5 and side effects performed' and then '5'
}

但是,如果我想保护 List 或对象而不是 int,我该怎么办?

//in b.dart
class B {
  List<int> _y;
  List<int> get y => _y;
  set y(List<int> value) {
    bool validation_ok=true;
    //do some validation/processing
    if (validation_ok) {
      _y = value;
      //perform side effects that should happen every time _y changes e.g. save to SharedPreferences
      print('Validated $value and side effects performed');
    }
  }
}
//in bmain.dart
import 'b.dart';
void main() {
  B b = B();
  b.y = [5]; //if validation successful stores [5] to _y and performs side effects
  print(b.y); //prints 'Validated [5] and side effects performed' and '[5]'
  b.y.add(6); //now _y is [5,6] but no validation was done on 6 and no side effects performed
  print(b.y); //prints '[5,6]' only
}

请注意,在 bmain.dart 中,b.y.add(6) 行会添加到私有列表中,而无需通过 setter。如何确保不允许此类访问并且对私有列表或对象的任何更改都受到控制?

【问题讨论】:

标签: dart


【解决方案1】:

您不能公开一个可变对象并确保它没有被其他人更改。 这使您的选择为:

  • 根本不暴露对象。
  • 公开不允许修改的对象视图。

前者并不像听起来那么糟糕。如果您提供访问受保护对象成员的容器类成员,那么您不必公开对象本身。 (这甚至可能是个好主意,q.v. "the law of Demeter")。

后者意味着将真实对象包装在视图适配器中,如果您想进行更改,则会抛出该适配器。对于List,您可以使用UnmodifiableListView。对于其他课程,您可能需要自己编写一个。 这种解决方案显然只是肤浅的。访问不可修改列表的代码不能更改哪些对象是列表的元素,但如果这些对象本身是可变的,那么它们也可以更改。 通常保护列表本身就是您所需要的。

【讨论】:

    猜你喜欢
    • 2023-02-06
    • 2014-03-06
    • 2021-07-20
    • 2022-01-23
    • 2020-07-02
    • 2013-07-03
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    相关资源
    最近更新 更多