【问题标题】:Creating a Non-Instantiable, Non-Extendable Class创建一个不可实例化、不可扩展的类
【发布时间】:2018-07-15 02:23:28
【问题描述】:

我想创建一个类来对一些 static const 值进行分组。

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

dart 中防止依赖代码实例化此类的惯用方法是什么?我还想阻止扩展到此类。在Java 中,我会执行以下操作:

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

到目前为止,我能想到的只是抛出一个Exception,但我希望编译安全而不是在运行时停止代码。

class SomeClass {
  SomeClass() {
    throw new Exception("Instantiation of consts class not permitted");
  }
  ...

【问题讨论】:

    标签: class inheritance dart constants


    【解决方案1】:

    为你的类提供一个私有构造函数将使它只能在同一个文件中创建,否则它将不可见。这也可以防止用户在其他文件中扩展或混入该类。请注意,在同一个文件中,您仍然可以扩展它,因为您仍然可以访问构造函数。此外,用户将始终能够实现您的类,因为所有类都定义了一个隐式接口。

    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 {}
    

    【讨论】:

    • 谢谢!这似乎是我一直在寻找的!最后一种情况真的很有趣。我不知道你可以实现任何现有的类。我想试图阻止最后一个案例只是迂腐/不可能。
    • 我通常会选择// Do not mock this class的评论...这不是最好的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2016-06-19
    • 2015-07-05
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多