Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a Non-Instantiable, Non-Extendable Class

I want to make a class to group some static const values.

// SomeClass.dart
class SomeClass {
  static const SOME_CONST = 'some value';
}

What is the idiomatic way in dart to prevent dependent code from instantiating this class? I would also like to prevent extension to this class. In Java I would do the following:

// SomeClass.java
public final class SomeClass {
    private SomeClass () {}
    public static final String SOME_CONST = 'some value';
}

So far all I can think of is throwing an Exception, but I'd like to have compile safety as opposed to halting code in run-time.

class SomeClass {
  SomeClass() {
    throw new Exception("Instantiation of consts class not permitted");
  }
  ...
like image 213
flakes Avatar asked Jul 15 '18 02:07

flakes


1 Answers

Giving you class a private constructor will make it so it can only be created within the same file, otherwise it will not be visible. This also prevents users from extending or mixing-in the class in other files. Note that within the same file, you will still be able to extend it since you can still access the constructor. Also, users will always be able to implement your class, since all classes define an implicit interface.

class Foo {
  /// Private constructor, can only be invoked inside of this file (library).
  Foo._();

}

// Same file (library).
class Fizz extends Foo {
  Fizz() : super._();
}

// Different file (library).
class Bar extends Foo {} // Error: Foo does not have a zero-argument constructor

class Fizz extends Object with Foo {} // Error: The class Foo cannot be used as a mixin.

// Always allowed.
class Boo implements Foo {}
like image 199
Jonah Williams Avatar answered Sep 18 '22 10:09

Jonah Williams