单例嵌套 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 {@Overridepublic void getMessage() {Outer.this.someoneCalledMe();}}// ... but we can return it, being of// type MessageMessage 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言中枚举enum的用法

本文举例说明C语言中enum枚举关键字的用法。用来同时定义多个常量利用enum定义月份的例子如下。#include enum week {Mon1,Tue,Wed,Thu,Fri,Sat,Sun}; int main() {printf("%d",Tue); return 0; }这样定义Mon的值为1之后&#xff0c;Tue的值就被默认定义为2&#…

苹果更新未知错误17_iOS 13 新功能,静音未知来电

果粉俱乐部让科技更好的服务生活点击上方「蓝字」加入我们iOS 13 正式版系统已经推出了快三周时间&#xff0c;苹果在新系统当中带来了诸多功能改进&#xff0c;包括大家盼望已久的深色模式&#xff0c;新的音量调节设置&#xff0c;自定义流量下载限制等等。除此之外&#xff…

C/C 语言中extern的用法

声明外部变量现代编译器一般采用按文件编译的方式&#xff0c;因此在编译时&#xff0c;各个文件中定义的全局变量是互相透明的&#xff0c;也就是说&#xff0c;在编译时&#xff0c;全局变量的可见域限制在文件内部。下面举一个简单的例子。创建一个工程&#xff0c;里面含有…

设置公共请求参数_封装一个useFetch实现页面销毁取消请求

前端业务经常会出现这样一类问题&#xff0c;当用户网速过慢或是其他特殊情况下&#xff0c;该页面的请求还未完成&#xff0c;用户就已经点击其他页面跳出去了。理想状态下请求也是应该终止掉的&#xff0c;所以我们应该想办法将请求和页面卸载关联在一起。1 使用AbortControl…

rx 异步执行耗时_使用rx-java的异步抽象

rx 异步执行耗时对我而言&#xff0c;使用Rx-java的一大好处是&#xff0c;无论底层调用是同步还是异步&#xff0c;因此代码看起来都完全相同&#xff0c;因此该条目的标题也是如此。 考虑一个非常简单的客户代码用例&#xff0c;它执行三个缓慢运行的调用并将结果合并到一个…

C语言中return的各种用法

按初学的理解&#xff0c;return的任务就是返回对应的参数&#xff0c;在外层函数中对这个参数做进一步处理。实际上return的用法不只这些。为调用的函数返回参数值此类应用最为普遍&#xff0c;通常是在一个具有返回值的函数中&#xff0c;返回一个参数值&#xff0c;这个返回…

代码内查找函数引用_叮~~二级操作题 excel常考函数大梳理

1.AND函数格式&#xff1a;AND(logical1,logical2…)功能&#xff1a;and函数是一个逻辑函数&#xff0c;表示同时满足多个条件。通常配合if函数做条件判断&#xff0c;得值为true或者是false。2.OR函数格式&#xff1a;OR(logical1,logical2…)功能&#xff1a;or函数是一个逻…

hazelcast入门教程_Hazelcast入门指南第6部分

hazelcast入门教程这是有关Hazelcast的一系列文章中的第六篇。 如果一个人没有看过过去的五年&#xff0c;请到表中的内容后 &#xff0c;我创建赶上。 本地客户 在上一篇文章之后&#xff0c;我决定要去本地化。 是的&#xff0c;我将演示Hazelcast自己的Java客户端。 Java不…

总结C语言中的数组知识点

数组&#xff1a;只能存放一种数据类型&#xff0c;比如int类型的数组、float类型的数组&#xff0c;里面存放的数据称为“元素”。数组的定义&#xff1a;首先声明数组的类型&#xff0c;然后声明数组元素的个数&#xff0c;也就是定义需要多少存储空间。数组格式与初始化格式…

python学什么版本2020年_2020年了居然还有人在学Python?学python有什么用?

都2020年了居然还有人在学python&#xff1f;学python有什么用&#xff1f;真是气抖冷啊&#xff01;想学习python的小伙伴&#xff0c;可以加裙595227871 领取免费的学习资料为什么选择python&#xff1f;1.行业人才的需求 在过去五年里&#xff0c;呈现出爆发性增长的趋势。今…

主要矛盾和次要矛盾_次要GC,主要GC与完整GC

主要矛盾和次要矛盾在使用Plumbr中的GC暂停检测功能时&#xff0c;我被迫通过大量有关该主题的文章&#xff0c;书籍和演示工作。 在整个旅程中&#xff0c;我多次对次要&#xff0c;主要和完全GC事件的使用&#xff08;误用&#xff09;感到困惑。 这导致了这篇博客文章&#…

action mutation 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...

module与moduleCollection你一定要会啊&#xff01;Vuex源码学习(五)加工后的module在组件中使用vuex的dispatch和commit的时候&#xff0c;我们只要把action、mutation注册好&#xff0c;通过dispatch、commit调用一下方法名就可以做到。使用方式vue组件内//in vue componentt…

grunt 插件_从Grunt测试Grunt插件

grunt 插件编写针对grunt插件的测试结果比预期的要简单。 我需要运行多个任务配置&#xff0c;并想通过在主目录中键入grunt test来调用它们。 在第一个任务失败后&#xff0c;咕声通常会退出。 这使得不可能在主项目gruntfile中存储多个失败方案。 从那里运行它们将需要--for…

​嵌入式开发为什么选择C语言?

从语言特点来说C语言有出色的可移植性&#xff0c;能在多种不同体系结构的软/硬平台上运行。简洁紧凑&#xff0c;使用灵活的语法机制&#xff0c;并能直接访问硬件能够直接访问硬件的语言有&#xff1a;汇编和C语言汇编属于低级语言&#xff0c;难以完成一些复杂的功能&#x…

mysql 临时表 heap_mysql优化: 内存表和临时表

由于直接使用临时表来创建中间表&#xff0c;其速度不如人意&#xff0c;因而就有了把临时表建成内存表的想法。但内存表和临时表的区别且并不熟悉&#xff0c;需要查找资料了。一开始以为临时表是创建后存在&#xff0c;当连接断开时临时表就会被删除&#xff0c;即临时表是存…

序列化与反序列化的单例模式_序列化代理模式

序列化与反序列化的单例模式在上一篇文章中 &#xff0c;我谈到了一般的序列化。 这是更加集中的内容&#xff0c;并提供了一个细节&#xff1a; 序列化代理模式 。 这是处理序列化中许多问题的一种好方法&#xff0c;通常是最好的方法。 如果开发人员只想了解这一主题&#xf…

图解C语言的希尔排序

希尔排序是插入排序的一种&#xff0c;又称“缩小增量排序”&#xff0c;希尔排序是直接插入排序算法的一种更高效的改进版本。希尔排序的基本思想设等待排序等元素序列有n个元素&#xff0c;首先取一个整数increment&#xff08;小于n&#xff09;作为间隔将全部元素分为n/inc…

给oim_对OIM Web(UI)层进行压力测试

给oimOracle IDM中的默认配置保留20个专用于服务前端&#xff08;UI&#xff09;请求的线程 。 这基本上意味着应用程序服务器具有20个线程池&#xff0c;可用于为通过Web控制台&#xff08;/ identity或/ sysadmin&#xff09;访问OIM的用户提供服务。 对于Weblogic &#xf…

windows mysql is read only_mysql中Table is read only错误解决方法(转载)

下面来给各位同学介绍一下关于mysql中Table is read only的解决技巧&#xff0c;希望例子能帮助到各位。今天再我把数据库data 拷贝到linux 下运行程序 ”mysql中Table is read only的解决“ 出现这样的问题&#xff0c;查询资料。linux下执行如下命令即可#mysqladmin -u root…

C语言打印输出红色字体

除了Linux&#xff0c;在VS下也可以实现变色这一效果&#xff0c;先看下面的一段代码&#xff1a;#include int main(int argc,char **argv){ printf("\033[44;37;5m hello world\033[0m\n");return 0;}编译后运行上述代码&#xff0c;结果如下&#xff1a;可见&…