为什么是List list = new ArrayList() 而不直接用ArrayList
为什么是List list = new ArrayList(),而不直接用ArrayList?
编程是要面向对象编程,针对抽象(接口),而非具体。List 是接口,ArrayList是实现。
实现List接口的有ArrayList、LinkedList、Vector等,所以用哪个就直接new 一个接口实现
这是一种很好的设计模式.一个接口有多种实现,这种写法是java面向对象的一种思想,依赖倒置原则,即依赖于抽象不依赖于实现(具体)。
给调用者提供的应该是接口或者抽象类,而实现者可以实现或者继承接口或者抽象类来满足调用者,这样调用者不必知道实现者怎样操作,实现者也可以根据具体情况去实现,这样去除了耦合。这就是java设计模式的基础思想之一。
从Java语法上,这种方式是使用接口引用指向具体实现,这样大大提高了代码使用的灵活性。
比如,你若希望用LinkedList的实现来替代ArrayList的话,只需改动一行即可:
List list = new LinkedList();
而程序中的其它部分不需要改动,这样比较灵活,不会失去通用性。
不过有的时候,你如果能确定后边用的全部是ArrayList,最好使用ArrayList list = new ArrayList();
ArrayList list = new ArrayList()
将ArrayList 改为了List,并且返回了这个List
那么以后用的烦恼就是
if(list instanceOf java.util.ArrayList){
//do something
}
else if(list instanceOf java.util.LinkedList){
//error
}
else if(list instanceOf cn.com.bigc.myList){
//do;……some xp not defined in List
}
……
如果你要想把这个if else去掉,那么,你还必须再写几个类。呵呵,这样的代价是不值得的。
如果你事先已经确定了你肯定采用ArrayList,为什么要用List代替呢?如果用List代替,那么肯定是我所有的操作基本上都是它父类已经定义好的,否则这种替代,个人以为不一定合算。
为什么是List list = new ArrayList() 而不直接用ArrayList的更多相关文章
- Mybatis学习之自定义持久层框架(一) 为什么要用框架而不直接用JDBC?
前言 说起Mybatis,相信大家都不会感到陌生,它是一款优秀的持久层框架,应用于java后端开发中,为客户端程序提供访问数据库的接口. 我们都知道,JDBC是Java语言中用来规范客户端程序如何来访 ...
- 直接用<img> 的src属性显示base64转码后的字符串成图片
直接用<img> 的src属性显示base64转码后的字符串成图片 <img src="base64转码后的字符串" ></img> 下面的图片 ...
- javase基础回顾(一)ArrayList深入解析 解读ArrayList源代码(JDK1.8.0_92)
我们在学习这一块内容时需要注意的一个问题是 集合中存放的依然是对象的引用而不是对象本身. List接口扩展了Collection并声明存储一系列元素的类集的特性.使用一个基于零的下标,元素可以通过它们 ...
- 直接用<img> 的src属性显示base64转码后的字符串成图片【原】
直接用<img> 的src属性显示base64转码后的字符串成图片 <img src="data:image/gif;base64,base64转码后的字符串" ...
- new ArrayList(0) 和 new ArrayList() 和一样吗?
第一感觉是一样的,盲猜后者调用了前者,并传入参数 0.然而,无论是 JDK 7 还是 JDK 8,这两个方法构造的结果都是不一样的.JDK 开发人员在这方面作了优化. JDK 7 在 Java 7 中 ...
- 服务之间的调用为啥不直接用 HTTP 而用 RPC?
什么是 RPC?RPC原理是什么? 什么是 RPC? RPC(Remote Procedure Call)-远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.比 ...
- BigDecimalAvoidDoubleConstructorRule:不要直接用double变量作为构造BigDecimal的参数
先上结论: 不要直接用double变量作为构造BigDecimal的参数. 线上有这么一段Java代码逻辑: 1,接口传来一个JSON串,里面有个数字:57.3. 2,解析JSON并把这个数字保存在一 ...
- 每日学习笔记:js中可以直接用id名调用的问题?
在JavaScript中,标准的id选择器调用语法是: document.getElementById('myid').style.width = pc + "%"; 但是,今天发 ...
- 只用@property定义一个属性speed,子类不能直接用_speed,需要在interface的成员变量列表里写上_speed
//写法一: @interface Person : NSObject { } @property (nonatomic, strong) NSString *name; @end @implemen ...
随机推荐
- WCF中的标准绑定
使用过WCF的童鞋们都很清楚,绑定是必须的.我将这些绑定总结了下. 一.标准绑定简要说明 1.basicHttpBinding 基于WS-I Basic Profile 1.1 的web服务,所需的. ...
- RTMP流媒体播放过程(转)
本文描述了从打开一个RTMP流媒体到视音频数据开始播放的全过程. 注意:RTMP中的逻辑结构 RTMP协议规定,播放一个流媒体有两个前提步骤:第一步,建立一个网络连接(NetConnection):第 ...
- cocos基础教程(4)基础概念介绍
在Cocos2d-x-3.x引擎中,采用节点树形结构来管理游戏对象,一个游戏可以划分为不同的场景,一个场景又可以分为不同的层,一个层又可以拥有任意个可见的游戏节点(即对象,游戏中基本上所有的类都派生于 ...
- linux下搭建Nginx
Linux上搭建nginx,及简单配置 在上家公司都是运维安装nginx,到新公司后代码开发完成部署测试服务器要求自己装nginx,研究了好久安装好之后,到正式上线还要自己安装,索性把安装步骤自己记 ...
- centos配置yum源
1.登录mirrors.163.com 2.点击centos后面的“centos使用帮助” 3.下载CentOS7-Base-163.repo 4.sudo mv /etc/yum.repos.d/C ...
- NGUIJoysticK
原始的: using UnityEngine; using System.Collections; public class NGUIJoystick : MonoBehaviour { public ...
- UItableView 编辑
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:( ...
- linux 搭建hexo博客
搭建环境: CentOS 6.5 1.安装git的编译包 yum -y install gcc zlib-devel openssl-devel perl cpio expat-devel gette ...
- HDOJ 1875
畅通工程再续 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- MyBatis调用存储过程
MySQL存储过程 DROP PROCEDURE IF EXISTS transferMoney; -- 实现转账功能的存储过程 CREATE PROCEDURE transferMoney ( IN ...