diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0944a53..68aa55b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,6 @@
-## 1.1.1-dev
+## 1.2.0
 
-* Switched from using lints in package:pedantic to package:lints.
+* Adds `Characters.empty` constant and makes `Characters("")` return it.
 
 ## 1.1.0
 
diff --git a/lib/src/characters.dart b/lib/src/characters.dart
index bcc70bb..b8b7949 100644
--- a/lib/src/characters.dart
+++ b/lib/src/characters.dart
@@ -20,9 +20,15 @@
 /// but which also provides ways to select other ranges of characters
 /// in different ways.
 abstract class Characters implements Iterable<String> {
+  /// An empty [Characters] containing no characters.
+  static const Characters empty = StringCharacters("");
+
   /// Creates a [Characters] allowing iteration of
   /// the characters of [string].
-  factory Characters(String string) = StringCharacters;
+  ///
+  /// Returns [empty] if [string] is empty.
+  factory Characters(String string) =>
+      string.isEmpty ? empty : StringCharacters(string);
 
   /// The string to iterate over.
   String get string;
diff --git a/lib/src/characters_impl.dart b/lib/src/characters_impl.dart
index 0791ec0..389400c 100644
--- a/lib/src/characters_impl.dart
+++ b/lib/src/characters_impl.dart
@@ -12,9 +12,6 @@
 ///
 /// Backed by a single string.
 class StringCharacters extends Iterable<String> implements Characters {
-  // Try to avoid allocating more empty grapheme clusters.
-  static const StringCharacters _empty = StringCharacters("");
-
   @override
   final String string;
 
@@ -219,7 +216,7 @@
 
   Characters _skip(int count) {
     var start = _skipIndices(count, 0, null);
-    if (start == string.length) return _empty;
+    if (start == string.length) return Characters.empty;
     return StringCharacters(string.substring(start));
   }
 
@@ -240,12 +237,12 @@
     RangeError.checkNotNegative(start, "start");
     if (end == null) return _skip(start);
     if (end < start) throw RangeError.range(end, start, null, "end");
-    if (end == start) return _empty;
+    if (end == start) return Characters.empty;
     if (start == 0) return _take(end);
     if (string.isEmpty) return this;
     var breaks = Breaks(string, 0, string.length, stateSoTNoBreak);
     var startIndex = _skipIndices(start, 0, breaks);
-    if (startIndex == string.length) return _empty;
+    if (startIndex == string.length) return Characters.empty;
     var endIndex = _skipIndices(end - start, start, breaks);
     return StringCharacters(string.substring(startIndex, endIndex));
   }
@@ -276,13 +273,13 @@
       while ((index = breaks.nextBreak()) >= 0) {
         if (!test(string.substring(startIndex, index))) {
           if (startIndex == 0) return this;
-          if (startIndex == stringLength) return _empty;
+          if (startIndex == stringLength) return Characters.empty;
           return StringCharacters(string.substring(startIndex));
         }
         startIndex = index;
       }
     }
-    return _empty;
+    return Characters.empty;
   }
 
   @override
@@ -293,7 +290,7 @@
       var endIndex = 0;
       while ((index = breaks.nextBreak()) >= 0) {
         if (!test(string.substring(endIndex, index))) {
-          if (endIndex == 0) return _empty;
+          if (endIndex == 0) return Characters.empty;
           return StringCharacters(string.substring(0, endIndex));
         }
         endIndex = index;
@@ -305,7 +302,7 @@
   @override
   Characters where(bool Function(String) test) {
     var string = super.where(test).join();
-    if (string.isEmpty) return _empty;
+    if (string.isEmpty) return Characters.empty;
     return StringCharacters(super.where(test).join());
   }
 
@@ -326,12 +323,12 @@
           endIndex = index;
           count--;
         } else {
-          return _empty;
+          return Characters.empty;
         }
       }
       if (endIndex > 0) return StringCharacters(string.substring(0, endIndex));
     }
-    return _empty;
+    return Characters.empty;
   }
 
   @override
@@ -343,18 +340,20 @@
       while ((index = breaks.nextBreak()) >= 0) {
         if (!test(string.substring(index, end))) {
           if (end == string.length) return this;
-          return end == 0 ? _empty : StringCharacters(string.substring(0, end));
+          return end == 0
+              ? Characters.empty
+              : StringCharacters(string.substring(0, end));
         }
         end = index;
       }
     }
-    return _empty;
+    return Characters.empty;
   }
 
   @override
   Characters takeLast(int count) {
     RangeError.checkNotNegative(count, "count");
-    if (count == 0) return _empty;
+    if (count == 0) return Characters.empty;
     if (string.isNotEmpty) {
       var breaks = BackBreaks(string, string.length, 0, stateEoTNoBreak);
       var startIndex = string.length;
@@ -382,7 +381,7 @@
       var start = string.length;
       while ((index = breaks.nextBreak()) >= 0) {
         if (!test(string.substring(index, start))) {
-          if (start == string.length) return _empty;
+          if (start == string.length) return Characters.empty;
           return StringCharacters(string.substring(start));
         }
         start = index;
