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文件就会每周一执行一次

略方便