Junit和Spring配合

JUnit官网

Spring官网

IDEA大杀器:JunitGenerator,可以自动生成Junit的测试接口,剩下我们就只要实现每个todo就好

为了配合Spring的注入,在测试的class前引入XML配置文件,和Spring-test套件

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("application.xml")

私有的方法用反射,public的方法实例化之后直接使用,记得每个java bean用工具生成好equals和hashcode。Junit就能和你的项目好好工作了

为什么我们要用getter/setter方法

第一,历史遗留原因,get/set方法从一种个人习惯被整个产业绑架了;

第二,面向对象的需要,我们可以把基本数据类型做输出前处理;

第三,我们可以把对数据的完整性的校验从流程类往基本对象身上推,逻辑层很少或者根本不用管理任何数据验证的事项,避免在逻辑代码中夹杂大量的数据校验(这个很重要,大部分业务代码为了尽快完成都是想到什么就是添加什么)。

 

代码重构

 

如下几个原则是必要的,也是今后落实代码时候要注意的:

  1. 数据类本身应该对自身的数据完整负责,加解密负责;
  2. 处理逻辑的对象尽量不要包含数据;
  3. 非数据验证的工具类抽取出来存放在单独的Utils类;
  4. 数据类的验证工具如果发现有复用,就要考虑对象是否有继承关系或者是共用一个接口,抽象出接口;
  5. 逻辑复杂的方法一定要降低复杂度,代码控制到20行以内一般就能够轻易地找出bug;
  6. 如果发现一个对象,经常是几部分数据互斥出现使用的,要考虑拆分成多个对象。

网络层级划分

OSI七层就不说了,在transportion描述的太详细了,其实可以归结为五层。

即是:

应用层(Application):Http,P2P这种,基本考虑的是字符串,内容。

运输层(Transportation):传输层用于确定应用层的消息用什么方式传输(可靠地传输或者是不可靠的传输,是否要流量限制等等)

网络层(Network):负责选择路径的层面(两个节点间会有大于等于一个的路由)

链路层(Data Link):协商每两个具体节点间的通信细节(直觉上认为是两个直达节点,没有第三个路由器之间的节点)

EffectiveJava(一)

第十三条:

应使得类对外暴露的接口最小化,能private就private,能final就final。

十四条:

应该提供访问方法而不应该公有域。

理由:可以在内部改变的时候外部调用可以不改变

十五条:

除非必要,尽量使用非可变对象。

理由:非可变对象的状态是可以预测的,如果一定是要可变的,要减少可变对象的状态。

 

 

List的可协变性疑问(二)

昨天心有不甘,觉得Java的开发人员不可能出现这种错误的,所以又继续的看资料。

其实容器是分为元类型和和泛型(可能我扯中文太蛋疼了)。。实际意思就是对于编译器来说List<Object>和List不是一个事情,但是最终编译器会替我们将List<Type>的类型擦除,最终JVM看到的其实还是List而不是List<Object>然后做强制转换的。我们反编译一下这个java文件的class看看就清晰了。

继续阅读“List的可协变性疑问(二)”

List的可协变性疑问

package com.company;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<A> a = Arrays.asList(new A(), new B(), new C());
        for (A aa : a) {
            System.out.println(aa instanceof C);
        }
    }

}

class A {
    public A() {
        System.out.println("new A");
    }

    @Override
    public String toString() {
        return "I'm A";
    }
}

class B extends A {
    public B() {
        System.out.println("new B");
    }

    @Override
    public String toString() {
        return "I'm B";
    }
}

class C extends B {
    public C() {
        System.out.println("new C");
    }

    @Override
    public String toString() {
        return "I'm C";
    }
}

在1.8以前的版本这个代码是无法运行的,原因是List<>具有不可协变性,可是在1.8这个版本之后,这是可以运行的。而且里面的内容也的确是实例化了子类。然后我就蒙逼了。说好的Collettion的不可协变性完蛋了。。。。

Linux定时备份任务

在当前用户目录下新建一个sh

按照我的备份方式就是

tar -jPcf BackupPath.tar.gztoBackupPath

然后运行crontab -e写入

* * * * 1 sh {你sh所在的目录位置}+{你的sh文件名字全称}

保存,然后这个sh文件就会每周一执行一次

略方便