Creating a Non-Instantiable, Non-Extendable Class

2019-07-18 11:39发布

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");
  }
  ...

1条回答
做自己的国王
2楼-- · 2019-07-18 12:34

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 {}
查看更多
登录 后发表回答