Java程序员的日常—— 基于类的策略模式、List<?>与List、泛型编译警告、同比和环比
早晨起得太早,昨晚睡得太晚,一天都迷迷糊糊的。中午虽然睡了半个小时,可是依然没有缓过来。整个下午都在混沌中....不过今天下载了一款手游——《剑侠情缘》,感觉不错,喜欢这种类型的游戏。
今天主要的工作还是做业务需求,不过下午状态不好,看了下《Effective java》,正好重构了下代码。
effective java 通过函数来作为策略
通过函数作为策略有两个要注意的地方:
- 使用接口作为策略传入
- 如果长期调用,应该设置为静态内部类,避免频繁创建过多的匿名对象
下面举个简单的例子,针对Engineer类提供不同的策略做排序,比如按照年龄或者按照员工级别:
class Engineer{
private String name;
private int age;
private int level;
public Engineer(String name,int age,int level) {
this.name = name;
this.age = age;
this.level = level;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
}
public class Strategy {
public static final Comparator<Engineer> AGE_ORDER = new AgeComparator();
public static final Comparator<Engineer> LEVEL_ORDER = new LevelComparator();
private static class AgeComparator implements Comparator<Engineer>{
@Override
public int compare(Engineer e1, Engineer e2) {
return e1.getAge()-e2.getAge();
}
}
private static class LevelComparator implements Comparator<Engineer>{
@Override
public int compare(Engineer e1, Engineer e2) {
return e1.getLevel()-e2.getLevel();
}
}
public static void main(String[] args) {
List<Engineer> el = new ArrayList<>();
el.add(new Engineer("zhangsan", 26, 3));
el.add(new Engineer("lisi", 30, 2));
el.add(new Engineer("wangwu", 28, 1));
Collections.sort(el,AGE_ORDER);
System.out.println(JSON.toJSON(el));
Collections.sort(el,LEVEL_ORDER);
System.out.println(JSON.toJSON(el));
}
}
在上面的例子中,采用静态成员变量声明,可以在多次使用的时候节省创建对象的成本。而且静态成员在堆内存的分配上也更简单,不会每次都创建新的对象。
在真实的场景中,是在某个请求方法里面,返回一个List对象,需要对它按照日期排序。如果是普通的Collections.sort(list,new Comparator<xx>{})
这种方式,会在每次返回结果的时候,都创建一个匿名类,很显然会浪费不少内存空间,增加垃圾回收的压力。使用静态成员变量的方式,可以减少这种不必要的浪费。
List<?>与List
由于在1.5之前的版本,java是没有泛型概念的。因此在引入泛型后,需要考虑到以前代码的移植。
没有泛型的时候,如果使用List,可以往里面插入任意类型的值。但是在取得时候,如果类型不对就有问题了:
List list = new ArrayList();
list.add(1);
String list0 = list.get(0);//出错
为了避免这种问题,1.5引入泛型,这样一套代码可以适用于多种类型;还能在编译器就检查类型是否一致。
除了这种List<E> xxx
标准的泛型,java还提供了无限制性的泛型:
<?>意思是未知类型,就是不设上下限
<? extend Object>意思是继承于Object的未知类型
<? super Object>意思是Object的祖先类型
所以,尽量使用标准的格式,在某些情况下已知的一些通配限制,还可以使用<?>号加以限制。
记得最开始自己写代码的时候,满满的都是黄色标记,师兄就纠正我的做法,让我把这些警告全都去掉。其实随时保证没有警告的代码,才是最负责的做法。不管是自己屏蔽掉,还是做相应的解决,都好过编译的时候爆出一大堆警告好。
编译器警告
Java是一门编译型的语言,需要经过编译,变成class字节码才能执行。但是在编写泛型相关的代码时,总是会遇到一些警告。比如参数仅仅声明为Map,没有声明具体内部的内容等等。
在Eclipse中可以通过加入@SuppressWarning
注解来忽略警告,但是不推荐这种做法。除非你对自己的代码非常自信,保证不会出现其他的类型,而导致ClassCastException。所以尽量在写代码的时候不要产生警告,如果想要忽略,尽量考虑清楚入口出口是否不会出现意外。
常用的就是unckecked和rawtypes,一个是不检查内部变量,一个是不检查参数类型。
all to suppress all warnings
boxing to suppress warnings relative to boxing/unboxing operations
cast to suppress warnings relative to cast operations
dep-ann to suppress warnings relative to deprecated annotation
deprecation to suppress warnings relative to deprecation
fallthrough to suppress warnings relative to missing breaks in switch statements
finally to suppress warnings relative to finally block that don’t return
hiding to suppress warnings relative to locals that hide variable
incomplete-switch to suppress warnings relative to missing entries in a switch statement (enum case)
nls to suppress warnings relative to non-nls string literals
null to suppress warnings relative to null analysis
rawtypes to suppress warnings relative to un-specific types when using generics on class params
restriction to suppress warnings relative to usage of discouraged or forbidden references
serial to suppress warnings relative to missing serialVersionUID field for a serializable class
static-access to suppress warnings relative to incorrect static access
synthetic-access to suppress warnings relative to unoptimized access from inner classes
unchecked to suppress warnings relative to unchecked operations
unqualified-field-access to suppress warnings relative to field access unqualified
unused to suppress warnings relative to unused code
什么是同比和环比
做业务需求,还是需要了解些业务知识才行。无论是电商环境,还是传统企业,环比和同比是最常见的数据分析手段,可以通过对比明显的看到当前业务的变化趋势,有利于管理层即使做出调整,那么什么是环比,什么是同比呢?
- 环比就是现在的统计周期和上一个统计周期比较。
- 同比是与历史时期作比较。
举个例子:
- 2016年4月和2016年的3月相比,就是环比
- 2016年的10月和2015年的10月相比,就是同比
太业务化的东西,就不说了,免得设计到什么尴尬的信息。
睡觉时间到,养好精神,才能专注...
Java程序员的日常—— 基于类的策略模式、List<?>与List、泛型编译警告、同比和环比的更多相关文章
- Java程序员的日常——经验贴(纯干货)
工作当中遇到的事情比较杂,因此涉及的知识点也很多.这里暂且记录一下,今天遇到的知识点,纯干货~ 关于文件的解压和压缩 如果你的系统不支持tar -z命令 如果是古老的Unix系统,可能并不认识tar ...
- Java程序员的日常—— 《编程思想》关于类的使用常识
Java虽然利用JVM,让程序员可以放心大胆的使用,可是仍然会出现内存泄露等问题.世上没有绝对的银弹,因此也不能完全把所有的任务都交给JVM,了解Java中的初始化与垃圾回收还是必不可少的知识. 关于 ...
- Java程序员的日常—— Properties文件的读写
在日常的Java程序开发中,Properties文件的读写是很常用的.经常有开发系统通过properties文件来当做配置文件,方便用户对系统参数进行调整. 那么本片就来简单的介绍下,如何使用Prop ...
- Java程序员的日常—— 垃圾回收中引用类型的作用
在Java里面,是不需要太过于关乎垃圾回收,但是这并不意味着开发者可以不了解垃圾回收的机制,况且在java中内存泄露也是家常便饭的事情.因此了解垃圾回收的相关知识就显得很重要了. 引用,在垃圾回收中是 ...
- Java程序员的日常 —— 多进程开发
最近再弄进程管理相关的工作,因此必要的就涉及到各种系统下关于进程的管理. 这里简单的介绍下: 如何在Java中执行命令 在windows下肯定是dos命令了,而在linux则为shell命令.执行的方 ...
- Java程序员的日常—— Arrays工具类的使用
这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排 ...
- Java程序员的日常—— FileUtils工具类的使用
package cn.xingoo.learn.commons; import org.apache.commons.io.FileUtils; import org.apache.commons.i ...
- Java程序员的日常 —— 《编程思想》持有对象
集合框架可以说是Java里面必备的知识点了,日常的使用中也会遇到各种情况需要使用到集合.下面就简单介绍下各种集合的使用场景: List List可以看做是数组,实现的方式有两种: ArrayList ...
- Java程序员的日常——存储过程知识普及
存储过程是保存可以接受或返回用户提供参数的SQL语句集合.在日常的使用中,经常会遇到复杂的业务逻辑和对数据库的操作,使用存储过程可以进行封装.可以在数据库中定义子程序,然后把子程序存储在数据库服务器, ...
随机推荐
- STM32之独立看门狗与窗口看门狗总结
一.独立看门狗 STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路 ...
- navicat连接虚拟机(centos)中的mysql
直接上方法: 首先配置CentOS下防火墙iptables规则: # vim /etc/sysconfig/iptables 向其中加入下列规则: -A INPUT -m state –state N ...
- spring batch部分
引用高人的:http://kanpiaoxue.iteye.com/blog/1768887
- WPF Touch操作滚动条,Window弹跳
WPF,用ScrollViewer控件,触屏开发,当滑动到最后时会使整个窗体弹跳一下 原因是因为ScrollViewer触屏操作原生支持惯性,ScrollViewer中的内容滚动到边界是会自动触发Wi ...
- 有一种感动叫ACM(记陈立杰在成都赛区开幕式上的讲话)
各位选手,各位教练,大家好,我是来自清华大学交叉信息学院的陈立杰,今天很荣幸站在这里代表全体参赛选手发言.对于我来说,这是我第一次正式参加ACM的比赛.不过我跟ACM之间的缘分,大概在很早的时候就已经 ...
- 尝试u3d中将代码与编辑器分离
最近与朋友交流,他一直是做端游,最近接触了u3d以后无法忍受代码与配置文件,美术资源全部纠缠在一起的状况,于是一直在琢磨怎么将编辑器与代码彻底分离. 自己也抽空研究一下,碰到一些问题先记录下来. 首先 ...
- 【转】Chrome快捷键
感谢原作者:http://www.cnblogs.com/mikalshao/archive/2010/11/03/1868568.html 标签页和窗口快捷键 Ctrl+N 打开新窗口. Ctrl+ ...
- HDU 1010 Tempter of the Bone
题意:从开始位置走到结束位置,恰好走 t 步 YES 否则 NO 搜索题,由于是恰好走到,所以用到了奇偶剪枝 什么是奇偶剪枝,我也是刚知道 所给步数为 t ,起始位置坐标 (begin_x,begin ...
- jquery操作dom
1访问元素(属性,内容,值,css) 1元素属性(获取,设置,删除) .attr(name) .attr(key, value) || .attr({key0:value0, key1:value1 ...
- android开发中监控android软件网络请求的软件Charles使用入门
1.下载并安状软件,官网在此: http://www.charlesproxy.com/ 2.前题条件,电脑和手机必须在同一网段 3.在Charles界面选择菜单 proxy->proxy se ...