单例嵌套 ios_嵌套类型的前5个用例

单例嵌套 ios

前几天,关于reddit进行了有趣的讨论,即静态内部类。 什么时候太多?

首先,让我们回顾一下Java的基本历史知识。 Java语言提供了四个级别的嵌套类 ,通过“ Java语言”,我的意思是这些构造仅是“语法糖”。 它们在仅了解普通类的JVM中不存在。

(静态)嵌套类

class Outer {
    static class Inner {
    }
}

在这种情况下, Inner完全独立于Outer ,除了公共的共享名称空间。

内部班

class Outer {
    class Inner {
    }
}

在这种情况下, Inner实例对其所在的Outer实例具有隐式引用。 换句话说,没有关联的Outer实例就不会有Inner实例。

创建此类实例的Java方法如下:

Outer.Inner yikes = new Outer().new Inner();

看起来很尴尬的东西很有道理。 考虑在Outer内部的某个地方创建Inner实例:

class Outer {
    class Inner {
    }

    void somewhereInside() {
        // We're already in the scope of Outer.
        // We don't have to qualify Inner explicitly.
        Inner aaahOK;

        // This is what we're used to writing.
        aaahOK = new Inner();

        // As all other locally scoped methods, we can
        // access the Inner constructor by 
        // dereferencing it from "this". We just
        // hardly ever write "this"
        aaahOK = this.new Inner();
    }
}

请注意,与publicabstract关键字非常相似, static关键字对于嵌套接口是隐式的。 乍看之下,以下假设语法可能很熟悉……:

class Outer {
    <non-static> interface Inner {
        default void doSomething() {
            Outer.this.doSomething();
        }
    }

    void doSomething() {}
}

……不可能写上面的东西。 除了缺少<non-static>关键字外,似乎没有任何明显的理由解释为什么“内部接口”不可行。 我怀疑这是通常的情况–必须有一些与向后兼容和/或多重继承有关的边缘案例警告,可以防止这种情况。

本地班

class Outer {
    void somewhereInside() {
        class Inner {
        }
    }
}

本地类可能是Java中鲜为人知的功能之一,因为它们几乎没有用处。 本地类是命名类型,其范围仅扩展到封闭方法。 显而易见的用例是您想在该方法中多次重用这种类型,例如在JavaFX应用程序中构造多个类似的侦听器。

匿名班

class Outer {
    Serializable dummy = new Serializable() {};
}

匿名类是仅具有一个实例的另一种类型的子类型。

嵌套类的前5个用例

如果未在静态上下文中定义,则所有匿名类,本地类和内部类都保留对其封闭实例的引用。 如果让这些类的实例泄漏到它们的范围之外,可能会造成很多麻烦。 在我们的文章中阅读有关该麻烦的更多信息: 不要聪明:Double Curly Braces Anti Pattern

但是,通常您确实希望从该封闭实例中获利。 拥有某种可以在不公开实际实现的情况下返回的“消息”对象可能非常有用:

class Outer {

    // This implementation is private ...
    private class Inner implements Message {
        @Override
        public void getMessage() {
            Outer.this.someoneCalledMe();
        }
    }

    // ... but we can return it, being of
    // type Message
    Message hello() {
        return new Inner();
    }

    void someoneCalledMe() {}
}

但是,对于(静态)嵌套类,没有封闭范围,因为Inner实例完全独立于任何Outer实例。 那么,使用这样的嵌套类而不是顶级类型有什么意义呢?

1.与外部类型的关联

如果您想与全世界进行交流,嘿,这个(内部)类型与这个(外部)类型完全相关,并且单独使用没有意义,那么您可以嵌套这些类型。 例如,这是通过MapMap.Entry完成的:

public interface Map<K, V> {
    interface Entry<K, V> {
    }
}

2.从外部隐藏外部

如果包(默认)可见性还不足以满足您的类型,则可以创建private static类,这些private static类仅对其封装类型和该封装类型的所有其他嵌套类型可用。 这实际上是静态嵌套类的主要用例。

class Outer {
    private static class Inner {
    }
}

class Outer2 {
    Outer.Inner nope;
}

3.保护类型

这确实是一个非常罕见的用例,但是有时,在类层次结构中,您需要只希望对给定类型的子类型可用的类型。 这是protected static类的用例:

class Parent {
    protected static class OnlySubtypesCanSeeMe {
    }

    protected OnlySubtypesCanSeeMe someMethod() {
        return new OnlySubtypesCanSeeMe();
    }
}

class Child extends Parent {
    OnlySubtypesCanSeeMe wow = someMethod();
}

4.模拟模块

与Ceylon不同,Java没有一流的模块 。 使用Maven或OSGi,可以向Java的构建(Maven)或运行时(OSGi)环境中添加一些模块化行为,但是如果要用代码表示模块,则实际上是不可能的。

但是,您可以使用静态嵌套类按照约定建立模块。 让我们看一下java.util.stream包。 我们可以将其视为一个模块,在此模块中,我们有几个“子模块”或类型组,例如内部java.util.stream.Nodes类,大致类似于:

final class Nodes {
    private Nodes() {}
    private static abstract class AbstractConcNode {}
    static final class ConcNode {
        static final class OfInt {}
        static final class OfLong {}
    }
    private static final class FixedNodeBuilder {}
    // ...
}

所有java.util.stream包都可以使用其中一些Nodes东西,因此我们可以说,编写方式有类似以下内容:

  • 合成的java.util.stream.nodes子包,仅对java.util.stream “模块”可见
  • 几个java.util.stream.nodes.*类型,也仅对java.util.stream “模块”可见
  • 合成java.util.stream.nodes包中的几个“顶级”函数(静态方法)

对我来说看起来很像锡兰!

5.外观原因

最后一点很无聊。 或有些人可能会觉得有趣 。 这是关于品味或易于写作的事情。 有些类是如此之小且无关紧要,将它们写在另一个类中更容易。 为您保存一个.java文件。 为什么不。

结论

在Java 8时代,考虑Java的非常老的功能,该语言可能不会被证明是非常令人兴奋的。 静态嵌套类是一些小众用例的很好理解的工具。

但是,本文的重点是这个。 每次嵌套一个类时,如果您绝对不需要引用封闭的实例,请确保将其设为static您永远不知道该引用何时会在生产中使您的应用程序崩溃

翻译自: https://www.javacodegeeks.com/2015/02/top-5-use-cases-for-nested-types.html

单例嵌套 ios

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,利用 UVM_ROOT 实现调用多个测试用例: ```systemverilog module testbench; import uvm_pkg::*; `include "uvm_macros.svh" // 定义需要调用的测试用例 `include "testcase1.sv" `include "testcase2.sv" `include "testcase3.sv" initial begin // 初始化 UVM 环境 uvm_component_utils #(testbench) uvm_component_registry; uvm_factory #(testbench) uvm_factory_inst; uvm_default_tree uvm_root_inst; // 创建测试用例实例并加入到 UVM 环境中 testcase1 tc1 = testcase1::type_id::create("tc1", null); tc1.build_phase(uvm_root_inst); tc1.connect_phase(uvm_root_inst); tc1.end_of_elaboration_phase(uvm_root_inst); tc1.start_of_simulation_phase(uvm_root_inst); testcase2 tc2 = testcase2::type_id::create("tc2", null); tc2.build_phase(uvm_root_inst); tc2.connect_phase(uvm_root_inst); tc2.end_of_elaboration_phase(uvm_root_inst); tc2.start_of_simulation_phase(uvm_root_inst); testcase3 tc3 = testcase3::type_id::create("tc3", null); tc3.build_phase(uvm_root_inst); tc3.connect_phase(uvm_root_inst); tc3.end_of_elaboration_phase(uvm_root_inst); tc3.start_of_simulation_phase(uvm_root_inst); // 运行测试用例 uvm_root_inst.run_test(); end endmodule ``` 在上面的代码中,我们首先定义了需要调用的三个测试用例,并在 `initial` 块中创建了它们的实例。然后,我们将它们加入到 UVM 环境中,在 `build_phase`、`connect_phase`、`end_of_elaboration_phase` 和 `start_of_simulation_phase` 阶段执行相应的方法,最后调用 `uvm_root_inst.run_test()` 运行测试用例。 需要注意的是,我们需要在 `import` 语句中导入 UVM 包,并在代码中使用 `uvm_component_utils` 宏和 `uvm_factory` 来管理测试用例实例。同时,我们还需要创建一个 `uvm_default_tree` 实例 `uvm_root_inst`,用于管理 UVM 组件树。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值