视频项目时长的存储和程序设计方案---单例模式节省内存空间以及自定义注解
一、苹果设备按钮(表单)样式外观设置
在苹果设备上,按钮等表单控件默认有苹果风格的外观,如图所示
如果需要需要和网页上显示一样的效果则需要修改以下的样式
如图网页效果
Css样式 -webkit-appearance:none;
-webkit是iOS和Android浏览器的内核名称
-moz Firefox内核名称
-o Opera
二、关于视频项目时长的存储和程序设计方案
数据库存储时使用int,而不是time,原因:
用int存储可以保存更大的值,比如对所有视频的时长求和会超过1000小时
用int存储可以很方便的计算,很方便进行比较
(如:筛选时长大于1小时小于2小时的视频)
不需要太多的类型转换和函数调用
在程序层面,为了提升用户体验,需要能够把秒数转换成“时间格式”01:30
TimeLength [数据模型] 将秒数转换成 ---> 小时:分钟:秒,也能实现反向转换
TimeLengthFormatter [格式化器] 与SpringMVC结合,让SpringMVC能够TimeLength的转换功能
@TimeLengthFormat [格式化注解] 可以应用到数据模型的属性上,让SpringMVC能够将表单数据绑定到数据模型的属性上
TimeLengthFormatterAnnotationFormatterFactory
TimeLengthFormatterFactory [格式化器工厂]
三、使用单例模式节省内存空间
TimeLength很多时候会等于0,为了避免在内存中创建很多为0的TimeLength对象、
可以在TimeLenth类中增加一个public static final 的属性ZERO
ZREO= new TimeLength(0,0,0);
当程序中需要一个等于0的TimeLength时,直接使用
TimeLength.ZERO
而不是自己 new TimeLength()
这种情况通常要求类是不可变的,以防止ZERO内部被篡改
这就要求去掉所有属性的setter方法
四、判断对象的断言
通常不能写 TestCase.assertEquals(obj,new Object());
因为obj是现在已经存在的对象,而new Object()将创建一个新对象,
已经存在对象和新对象一定不是同一个对象
通常会用下面的方法写断言:
方法1:通过toString()方法转换为字符串进行总量判断,前提是重写toString()方法
方法2:通过比较各个属性值判断,进行分量判断
五、自定义注解
Retention注解
Retention(保留)注解说明,这种类型的注解会被保留到那个阶段.
有三个值:
1.SOURCE —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略
2.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略
3.RUNTIME —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用.
@Target注解
目标、位置,注解可以标注的位置
Type 可以用在类、接口
Field 用在字段上
Parameter 用在参数上
Method 用在方法上
@Target:注解的作用目标
@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包
Documented 注解
Documented 注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中.
注意:定义注解使用的是@interface
在主机内部可以定义一些“方法”,这些“方法”就是注解中的“命名参数”
还可以使用defalut的命名参数
TimeLengthFormatterFactory implements AnnotationFormatterFactory<TimeLengthFormat>
格式化器注解工厂,负责将TimeLength小模型、
@TimeLengthFromat、TimeLengthFormatter 组合起来实现注解驱动的数据绑定,
也就是将标记了@TimeLength Format注解的属性与表单提交的数据
此工厂需要添加到SpringMVC的配置文件中
MyBatis自定义类型转换器
目标:将程序中的TimeLength对象转换成数据库中的int字段
或者反向将数据库中的int转换成TimeLength对象
方法:
方法一:直接实现TypeHandler接口
方法二:从BaseTypeHandle继承(已经处理了null的情况,推荐)
在TypeHandler类上标记注解以表明TypeHandler能够支持类型转换范围
@MappedJdbcTypes 数据库类型 可以写多个类型
@MappedTypes java类型,可以写多个类型