对于一个返回null 而不是零长度数组或者集合的方法,客户端几乎每次用到该方法都可能会忘记写专门处理null 返回值的代码,进而导致NPE。...在返回值这种级别上担心性能问题是不明智的,除非分析表明这个方法是造成性能问题的真正源头 对于不返回任何元素的调用,每次返回同一个零长度数组是有可能的,因为零长度数组不可变的,而不可变对象可能被自由的共享...编写数组与集合返回值的推荐做法 返回空数组,可以使用集合实现类的toArray()方法,例如:ArrayList.toArray(): private final List cheeseList...Collections.emptyList(): public List getCheeseList() { if (cheeseList.isEmpty()){ // 返回一个不可变的空集合...,没理由返回null,二是返回一个零长度的数组或者集合。
用好ORM的关键,我举的在于:设计O的时候是否会受到R的影响;同理,设计R的时候,是否受到了O的影响?也就是说设计实体类的时候,完全不去考虑数据库,设计数据库的时候也完全不考虑实体类!...用实际的工作经历来说明一下。我在做设计的时候,先根据需求设计数据库,这时候完全没有考虑类要如何设计(其实一开始根本就没有用实体类,呵呵)。...后来框架不断扩展,发现个问题:不弄个实体类来管理一下,确实挺麻烦的。那么如何来设计需要的类呢? 有一个表就建立一个类,表里的字段都是类的属性吗?真的是真么简单吗?...这是因为这个信息是很多地方都需要用到,而验证信息并不是必须的。只有页面表单里面才需要,“数据列表”和“数据查询”都不需要。 这样一来,表和类就不是完全对应,而是把一个表“拆开”了,对应多个类。...一个字段(的描述信息)就是一条记录,表单里需要的字段就是一个集合,数据列表里需要的字段是另一个集合……这样就非常方便。这样处理带来了很多好处,最明显的就是——权限到字段! ? ?
(要了解OEA中客户化的具体方案,见《基于OEA框架的客户化设计(一) 总体设计》) 为了使用CSLA而写的这些获取代码,在以后引入非CSLA实体时,可能都需要重写。...使用Repository模式,我们在主干版本中通过Repository工厂找到需要的类型A的Repository,然后通过它获取具体的对象集合并进行操作。...当扩展后,主干版本中同样的代码再次通过RepsotoryFactory获取A的Repository时,得到的其实是子类B的Repository,这样,它获取出来的对象集合都是B的列表。...这样,就实现完全的类型扩展,而且主干中的代码不需要任何的改变。 而一旦实体类被动态扩展,相应的数据层和界面也就被OEA框架自动地进行了调整。...同时,我们可以在Repository中管理一些整个实体类型的信息,例如某个实体类A的所有属性列表元数据。
什么是集合框架? 集合框架是一个代表、操作集合的统一架构。所有的集合框架都包含以下几点: 接口:表示集合的抽象数据类型。接口允许我们操作集合时不必关注具体实现,从而达到“多态”。...实现类:集合接口的具体实现,是重用性很高的数据结构。 算法:用来根据需要对实体类中的对象进行计算,比如查找,排序。 同一种算法可以对不同的集合实现类进行计算,这是利用了“多态”。 重用性很高。...还有一些操作整个集合的方法,比如 : boolean containsAll(Collection而不是并发。 并发与并行的概念区别还是挺大的。...而“并发”在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行,这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑
Synchronized和lock 5、集合类不安全 JUC结构 tools(工具类):又叫信号量三组工具类,包含有 CountDownLatch(倒计数) 是一个同步辅助类,在完成一组正在其他线程中执行的操作之前...,相比synchronized关键字来进行同步锁,功能更加强大,它为锁提供了一个框架,该框架允许更灵活地使用锁包含的实现类有: ReentrantLock 它是独占锁,是指只能被独自占领,即同一个时间点只能被一个线程锁获取到的锁...2、模拟并发,我需要启动 100 个线程去同时访问某一个地址,我希望它们能同时并发,而不是一个一个的去执行。...synchronized时,等待的线程会一直等待下去,不能够响应中断;通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。...4、同一个类的不同对象的对象锁互不干扰 5、类锁作用于整个类 更多锁(ReentrantLock、ReadWriteLock读写锁)的文章请关注更多文章 5、集合类不安全 ArrayList、HashSet
Clean架构可取分离DataLayer层的思路,当然还有整个降耦合的思路。 我构想的架构大概是这样子: ?...DataLayer获取在Android端无非是网络,本地数据库(Sqlite),本地文件(SharePreference,文件)。网络获取框架当然是现在火的不得了SSqure家的Retrofit。...accessToken : ""; } 首先这是个典型的单例对象,对于那些简单交互或者更直接的说法--获取单个对象而不是集合的应用场景就可以直接获取这个类去获得api...用一个原子Integer包装类保证了计数器的原子性,不会因为CPU指令的从排而污染数据。具体见下面对面,有些需要解释的地方有注释,大家看的时候比较方便。...//计数器 private final AtomicInteger loadingCount; private final MicalPrefs micalPrefs; //数据加载情况的回调接口集合
由于还没有时间把整个 EF 的 MSDN 拿下,所以暂时只是在网上看了一些相关的文章。...而最近又正好在重构 OEA 框架的元数据子系统,所以,这篇文章里,我主要对 EF 的元数据进行一个简单的分析。 注意,以下的分析只代表我的个人观点。 ...而继续调试到基类,会发现 MetadataItem 中的 MetadataProperties 属性集合中有一项正好就是名字为 Members,而值是恰好是刚才 5 个成员的集合: ?...当然,这并不是全部的元数据类型。...换句话说,我拿到一个 MetadataItem 的集合,如果我不把它们转换为子类型的话,无法进行强类型属性的使用,而只能使用字符串的匹配。
它返回的是IEnumerable而不是IEnumerable,这让它看起来就像是一个C# 1的接口,而不是泛型。...缺点是它接受ValidationContext对象作为参数,而几乎没有人知道如何使用这个类。以下是ValidationContext的属性。 DisplayName:获取或设置要验证成员的名称。...集合变更通知 正如我们需要知道单个属性的变更一样,我们也需要知道整个集合发生的变更。我们可以使用INotifyCollectionChanged接口来解决这个问题。...为此,集合需要在将对象添加到集合或从集合中移除时附加和移除事件处理程序。 变更跟踪和撤消 虽然使用不是很频繁,.NET还是提供了专门用于跟踪对象变更的接口,这些接口甚至还提供了撤消功能。...我通常假设RejectChanges会遍历对象图,并拒绝所有挂起的变更。但在涉及集合属性时,这可能有点蹊跷,最好是将其封装在类中,而不是尝试构建临时解决方案。
Entity Framework 实体框架的形成之旅--实体框架的开发的几个经验总结 在前阵子,我对实体框架进行了一定的研究,然后把整个学习的过程开了一个系列,以逐步深入的方式解读实体框架的相关技术,期间每每碰到一些新的问题需要潜入研究...我的整个实体框架的学习和研究,是以我的Winform框架顺利升级到这个实体框架基础上为一个阶段终结,这个阶段事情很多,从开始客运联网售票的WebAPI平台的开发,到微软实体框架的深入研究,以及《基于Metronic...1、实体框架主键的类型约束问题 在我们搭建整个实体框架的过程中,我们一般都是抽象封装处理很多基础的增删改查、分页等常见的数据处理功能,如下所示。...例如我们如果要获取一个树形机构列表,如果我们指定了一个开始的机构节点ID,我们需要递归获取下面的所有层次的集合的时候,常规的做法如下所示。...使用实体框架后,主要就是利用LINQ进行一些集合的操作,这些LINQ的操作虽然有点难度,不过学习清楚了,处理起来也是比较方便的。
但是这并不是一种面向对象的思考方式,而往往我们是以一种面向过程的思维去编程。...这样我们就把原本全部在service里面的逻辑划入到不同的负责相关职责的“领域对象”当中了,service的逻辑变得非常清楚明了,想实现A给B转账,直接获取A实体,然后调用A实体中的转账方法即可。...每次获取指标值时,我们都是先计算出需要的key集合(比如我要获取“单个账号最近10分钟的下单量”,我可能需要获取30个key,因为每个key的跨度是20s),然后获取到对应的value集合,再进行累加。...而实际上我们只是需要累加后的值,这里可以通过redis+lua脚本进行优化,脚本里面直接根据key集合获取value后进行累加然后返回给客户端,这样就较少了每次响应的数据量。...有了统一的标准就可以实现事件自动接入而不需要修改代码上线,这样也可以保证整个引擎的稳定性。 模型生命周期管理。
对于习惯使用 EF Core 和 关系数据的开发者来说,这看起来似乎有些奇怪。获取 Issue 的所有数据是没有必要且低效的。为什么我们不直接执行一个SQL插入命令到数据库,而不查询任何数据呢?...考虑数据的完整性、有效性和一致性。 而实际: 大多数聚合根没有子集合。 一个子集合最多不应该包含超过100-150个条目。...聚合根/实体中的主键 一个聚合根通常有一个ID属性作为其标识符(主键,Primark Key: PK)。推荐使用 Guid 作为聚合根实体的PK。 聚合中的实体(不是聚合根)可以使用复合主键。...一个设计良好的构造函数,担负以下职责: 获取所需的实体属性参数,来创建一个有效的实体。应该强制只传递必要的参数,并可以将非必要的属性作为可选参数。 检查参数的有效性。 初始化子集合。...AssignToAsync 获取一个 AppUser 实体,实际上只用到 user.Id,传递实体是为了确保参数值是一个存在的用户,而不是一个随机值。
而针对这样的场景,许多ORM框架都不做默认的处理,开发者往往每次都要做重复的工作:建立类似结构的表,编写关系处理代码,编写查询代码……而这种场景经常会出现,所以 Rafy 实体框架中,默认就支持了树型实体的一系列功能...此属性会映射为数据库中的字段。 TreeParent:该树节点的父节点实体。 TreeChildren:该树节点的所有子节点集合。...所以这个属性的值非常重要,只能由框架来自行维护,而不能由开发者来设置。...另外,EntityTreeChildren 集合可以按需加载。当它还没有进行加载时,遍历整个树只能遍历到当前已经在内存中的树节点。...使用此方法后,指定节点的父节点将被赋值到它的 TreeParent 属性上。 GetAllTreeParents:获取指定索引对应的树节点的所有父节点。
很多小伙伴可能知道是ConcurrentHashMap,却对其没有太多了解,本文就带大家先来看一下ConcurrentHashMap集合中的size()方法是如何保证准确获取集合大小的。...首先,通过size()方法取得的当前集合中数据总量的值,很可能不是一个精确值,也就是在调用size()方法还未得到返回值时,集合中的数据总量可能就已经发生了变化。...ConcurrentHashMap集合使用counterCells数组而不是baseCount属性记录集合中的键值对数据量,前提条件就是通过compareAndSetLong方法进行baseCount属性的操作时...而当计算某个线程的计数值应该存放在counterCells数组的哪一个索引位时,使用的就是“探针”值和counterCells数组长度通过“与”运算取余数的方式完成的。...▊《Java高并发与集合框架:JCF和JUC源码分析与实现》 银文杰 著 掌握Java集合框架和Java并发工具包,轻松应对80%的工作场景 本书并不讲解JCF和JUC中各个组件的基本使用方法,因为作者相信
造成如此慢的主要原因是锁, 同步集合会把整个Map或List锁起来,而并发集合不会。并发集合实现线程安全是通过使用先进的和成熟的技术像锁剥离。 ...,没有就再看当前运行中的线程数是不是已经达到了最大数,如果没有,就新分配一个线程去处理。 ...而不是锁。...Java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为Java 类,而不是作为语言的特性来实现。...简单来说,它有一个与锁相关的获取计数器,如果拥有锁的某个线程再次得到锁,那么获取计数器就加1,然后锁需要被释放两次才能获得真正释放。
为了方便开发人员后续快速接入 和 使用 JPA 操作数据库,本篇 Huazie 将向大家介绍笔者 Flea 框架下的 flea-db 模块封装JPA操作数据库的内容。1....() : 获取查询的记录行结果集合getResultList(int start, int max) : 获取查询的记录行结果集合(设置查询范围)getSingleResultList() : 获取查询的单个属性列结果集合...需要先调用 distinct,否则默认返回行记录结果集合getSingleResultList(int start, int max) : 获取查询的单个属性列结果集合(设置查询范围,可用于分页)。...需要先调用 distinct,否则默认返回行记录结果集合。getSingleResult() : 获取查询的单个结果。...,由子类实现(可参考下面的持久化单元 DAO 层实现)getEntityManager() :获取实体管理器getEntityManager(T entity) :获取实体管理器【entity 实体类对象实例
实体的创建 根据对应数据库内的表来创建实体,Enhance采用的是Spring Data JPA的形式来管理实体类,并且已经预先提供的一些Annotation,数据实体(Entity)对应数据库内的数据表...,并且同时可以获取内部提供的CRUD方法!!!...,第二个则是实体类主键的类型,这样方便我们在传参或者返回值时做到统一,否则还需要进行Object类型的转换,那样不仅麻烦还会提高运行成本,详细介绍请阅读 使用文档 暂时内置的方法 // 统计数据 Long...,针对MyBatis Enhance框架来说,我单独配套编写了一个代码生成工具,能够把创建实体、Mapper等必须需要类的自动化创建以及可以通过freemarker模版来完成自定义的实体类创建,从而实现代码上的真正的快速开发...敬请期待DSL动态查询 Enhance内部默认支持了单表的数据操作方法,但是我们平时在项目中多表查询是最普遍的,我结合了QueryDSL动态查询框架的优点将部分的基础实现迁移到了Enhance框架内,极大的方便了多表联合查询以及动态返回任意数据实体
准备一杯你最喜欢的咖啡或茶,随着本文一探究竟吧。基于计数器集合实现自增序号创建自增序号的集合我们可以使用计数器集合 counters 来实现实现自增序号,这也是官方推荐的一种实现方式。...由于 counters 集合中的 _id 字段值代表某个集合的名称,因此我们可以利用 counters 集合为多个集合实现自增 序号,而不仅限于单个集合。...集合中获取并自增 seq_value。...:使用从 counters 集合中获取的自增 seq_value 作为新文档的一个字段,插入到 posts 集合中。...完整的脚本示例代码下面是完整的 MongoDB 脚本示例代码,展示了如何创建集合、获取自增序号并插入新文档。
概述 Java语言中,提供了一套数据集合框架,其中定义了一些诸如List、Set等抽象数据类型,每个抽象数据类型的各个具体实现,底层又采用了不同的实现方式,比如ArrayList和LinkedList...Java中提供的遍历方式有哪些? 1、传统的for循环遍历,基于计数器的: 遍历者自己在集合外部维护一个计数器,然后依次读取每一个位置的元素,当读取到最后一个元素后,停止。...所以基于顺序存储集合的Iterator可以直接按位置访问数据。而基于链式存储集合的Iterator,正常的实现,都是需要保存当前遍历的位置。然后根据当前位置来向前或者向后移动指针。...所以我们可以知道,对于顺序存储,因为读取特定位置元素的平均时间复杂度是O(1),所以遍历整个集合的平均时间复杂度为O(n)。...Java的最佳实践是什么? Java数据集合框架中,提供了一个RandomAccess接口,该接口没有方法,只是一个标记。
默认情况下,MongoDB始终返回该_id字段(它自己的唯一ID字段,而不是我们从GameSpot提取的ID),但是我们可以告诉它通过指定一个0值来抑制它。...我们需要从文档中获取检测到的命名实体和概念的列表(单词列表): doc = nlp(str(review_words))... 我们可以打印出找到的实体以及实体的数量。...我们只需要创建一个函数来获取不同类别的实体的数量,然后使用它来获取所需的实体即可。...让我们从评论集合中获取分数值,对它们进行计数,然后绘制它们: scores = []...plt.xticks(rotation=-90)plt.show() 上图是给出的评分总数(从0到9.9)的图表...结论 收集,存储,检索和分析数据是当今世界上非常需要的技能,而MongoDB是最常用的NoSQL数据库平台之一。
一个线程安全的计数器类的同一个实例对象在被多个线程使用的情况下也不会出现计算失误。很显然你可以将集合类分成两组,线程安全和非线程安全的。...造成如此慢的主要原因是锁, 同步集合会把整个Map或List锁起来,而并发集合不会。并发集合实现线程安全是通过使用先进的和成熟的技术像锁剥离。...而不是锁。...Java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为Java 类,而不是作为语言的特性来实现。...简单来说,它有一个与锁相关的获取计数器,如果拥有锁的某个线程再次得到锁,那么获取计数器就加1,然后锁需要被释放两次才能获得真正释放。
领取专属 10元无门槛券
手把手带您无忧上云