Encapsulation in Dart

Encapsulation

Encapsulation is the principle that limits access to of an object's state; and the bundling of methods and operations that do work on a set of data.

In other languages such as C++ and Java, it is common to control access to a field by making it private and having public getters and setters for that field. In Dart, fields and getters/setter are indistinguishable.

Minimal Encapsulation

The following example has minimal encapsulation. You can directly access its fields freely.

class Employee {
  String name;
}

void main() {
  var myEmployee = Employee();
  myEmployee.name = "Bobby";
}

Private Fields

If you want to restrict access to a certain field outside of a class, you can make it private by prefixing the field name with an underscore.

class Employee {
  String name;
  int _salary; // Private - This field cannot be accessed outside of this class
}

Read-only fields

If you want read-only (get-only) fields, simply add the final keyword.

class Employee {
  final String name;
}

Setters and Getters

If we want to have more control over the field, we can use the "private field, public getter/setter" pattern.

For example:

  • let's say we want to store the name in lowercase
  • and, we want to display it with only the first letter capitalized.

We can do something like this:

String titleCase(String string) => "${string[0].toUpperCase()}${string.substring(1)}";

class Employee {
  String _name;
  String get name => titleCase(_name);
  set name(String newValue) { _name = newValue.toLowerCase(); }
}

void main() {
  var myEmployee = Employee();
  myEmployee.name = "BOBBY";
  print(myEmployee.name); // Bobby
}

No Comments Yet