亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java訪問(wèn)者模式的靜態(tài)動(dòng)態(tài)及偽動(dòng)態(tài)分派徹底理解

 更新時(shí)間:2022年06月23日 16:37:45   作者:Tom彈架構(gòu)  
這篇文章主要為大家介紹了java訪問(wèn)者模式的靜態(tài)動(dòng)態(tài)及偽動(dòng)態(tài)分派徹底理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

本文節(jié)選自《設(shè)計(jì)模式就該這樣學(xué)》

1 使用訪問(wèn)者模式實(shí)現(xiàn)KPI考核的場(chǎng)景

每到年底,管理層就要開始評(píng)定員工一年的工作績(jī)效,員工分為工程師和經(jīng)理;管理層有CEO和CTO。那么CTO關(guān)注工程師的代碼量、經(jīng)理的新產(chǎn)品數(shù)量;CEO關(guān)注工程師的KPI、經(jīng)理的KPI及新產(chǎn)品數(shù)量。

由于CEO和CTO對(duì)于不同的員工的關(guān)注點(diǎn)是不一樣的,這就需要對(duì)不同的員工類型進(jìn)行不同的處理。此時(shí),訪問(wèn)者模式可以派上用場(chǎng)了,來(lái)看代碼。

//員工基類
public abstract class Employee {
    public String name;
    public int kpi;//員工KPI
    public Employee(String name) {
        this.name = name;
        kpi = new Random().nextInt(10);
    }
    //核心方法,接受訪問(wèn)者的訪問(wèn)
    public abstract void accept(IVisitor visitor);
}

Employee類定義了員工基本信息及一個(gè)accept()方法,accept()方法表示接受訪問(wèn)者的訪問(wèn),由具體的子類來(lái)實(shí)現(xiàn)。訪問(wèn)者是一個(gè)接口,傳入不同的實(shí)現(xiàn)類,可訪問(wèn)不同的數(shù)據(jù)。下面看工程師Engineer類的代碼。

//工程師
public class Engineer extends Employee {
    public Engineer(String name) {
        super(name);
    }
    @Override
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }
    //工程師一年的代碼量
    public int getCodeLines() {
        return new Random().nextInt(10 * 10000);
    }
}

經(jīng)理Manager類的代碼如下。

//經(jīng)理
public class Manager extends Employee {
    public Manager(String name) {
        super(name);
    }
    @Override
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }
    //一年做的新產(chǎn)品數(shù)量
    public int getProducts() {
        return new Random().nextInt(10);
    }
}

工程師被考核的是代碼量,經(jīng)理被考核的是新產(chǎn)品數(shù)量,二者的職責(zé)不一樣。也正是因?yàn)橛羞@樣的差異性,才使得訪問(wèn)模式能夠在這個(gè)場(chǎng)景下發(fā)揮作用。Employee、Engineer、Manager 3個(gè)類型相當(dāng)于數(shù)據(jù)結(jié)構(gòu),這些類型相對(duì)穩(wěn)定,不會(huì)發(fā)生變化。

將這些員工添加到一個(gè)業(yè)務(wù)報(bào)表類中,公司高層可以通過(guò)該報(bào)表類的showReport()方法查看所有員工的業(yè)績(jī),代碼如下。

//員工業(yè)務(wù)報(bào)表類
public class BusinessReport {
    private List<Employee> employees = new LinkedList<Employee>();
    public BusinessReport() {
        employees.add(new Manager("經(jīng)理-A"));
        employees.add(new Engineer("工程師-A"));
        employees.add(new Engineer("工程師-B"));
        employees.add(new Engineer("工程師-C"));
        employees.add(new Manager("經(jīng)理-B"));
        employees.add(new Engineer("工程師-D"));
    }
    /**
     * 為訪問(wèn)者展示報(bào)表
     * @param visitor 公司高層,如CEO、CTO
     */
    public void showReport(IVisitor visitor) {
        for (Employee employee : employees) {
            employee.accept(visitor);
        }
    }
}

下面來(lái)看訪問(wèn)者類型的定義,訪問(wèn)者聲明了兩個(gè)visit()方法,分別對(duì)工程師和經(jīng)理訪問(wèn),代碼如下。

public interface IVisitor {
    //訪問(wèn)工程師類型
    void visit(Engineer engineer);
    //訪問(wèn)經(jīng)理類型
    void visit(Manager manager);
}

上面代碼定義了一個(gè)IVisitor接口,該接口有兩個(gè)visit()方法,參數(shù)分別是Engineer和Manager,也就是說(shuō)對(duì)于Engineer和Manager的訪問(wèn)會(huì)調(diào)用兩個(gè)不同的方法,以此達(dá)到差異化處理的目的。這兩個(gè)訪問(wèn)者具體的實(shí)現(xiàn)類為CEOVisitor類和CTOVisitor類。首先來(lái)看CEOVisitor類的代碼。

//CEO訪問(wèn)者
public class CEOVisitor implements IVisitor {
    public void visit(Engineer engineer) {
        System.out.println("工程師: " + engineer.name + ", KPI: " + engineer.kpi);
    }
    public void visit(Manager manager) {
        System.out.println("經(jīng)理: " + manager.name + ", KPI: " + manager.kpi +
                ", 新產(chǎn)品數(shù)量: " + manager.getProducts());
    }
}

在CEO的訪問(wèn)者中,CEO關(guān)注工程師的KPI、經(jīng)理的KPI和新產(chǎn)品數(shù)量,通過(guò)兩個(gè)visit()方法分別進(jìn)行處理。如果不使用訪問(wèn)者模式,只通過(guò)一個(gè)visit()方法進(jìn)行處理,則需要在這個(gè)visit()方法中進(jìn)行判斷,然后分別處理,代碼如下。

public class ReportUtil {
    public void visit(Employee employee) {
        if (employee instanceof Manager) {
            Manager manager = (Manager) employee;
            System.out.println("經(jīng)理: " + manager.name + ", KPI: " + manager.kpi +
                    ", 新產(chǎn)品數(shù)量: " + manager.getProducts());
        } else if (employee instanceof Engineer) {
            Engineer engineer = (Engineer) employee;
            System.out.println("工程師: " + engineer.name + ", KPI: " + engineer.kpi);
        }
    }
}

這就導(dǎo)致了if...else邏輯的嵌套及類型的強(qiáng)制轉(zhuǎn)換,難以擴(kuò)展和維護(hù),當(dāng)類型較多時(shí),這個(gè)ReportUtil就會(huì)很復(fù)雜。而使用訪問(wèn)者模式,通過(guò)同一個(gè)函數(shù)對(duì)不同的元素類型進(jìn)行相應(yīng)處理,使結(jié)構(gòu)更加清晰、靈活性更高。然后添加一個(gè)CTO的訪問(wèn)者類CTOVisitor。

public class CTOVisitor implements IVisitor {
    public void visit(Engineer engineer) {
        System.out.println("工程師: " + engineer.name + ", 代碼行數(shù): " + engineer.getCodeLines());
    }
    public void visit(Manager manager) {
        System.out.println("經(jīng)理: " + manager.name + ", 產(chǎn)品數(shù)量: " + manager.getProducts());
    }
}

重載的visit()方法會(huì)對(duì)元素進(jìn)行不同的操作,而通過(guò)注入不同的訪問(wèn)者又可以替換掉訪問(wèn)者的具體實(shí)現(xiàn),使得對(duì)元素的操作變得更靈活,可擴(kuò)展性更高,同時(shí),消除了類型轉(zhuǎn)換、if...else等“丑陋”的代碼。

客戶端測(cè)試代碼如下。

public static void main(String[] args) {
        //構(gòu)建報(bào)表
        BusinessReport report = new BusinessReport();
        System.out.println("=========== CEO看報(bào)表 ===========");
        report.showReport(new CEOVisitor());
        System.out.println("=========== CTO看報(bào)表 ===========");
        report.showReport(new CTOVisitor());
}

運(yùn)行結(jié)果如下圖所示。

file

在上述案例中,Employee扮演了Element角色,Engineer和Manager都是 ConcreteElement,CEOVisitor和CTOVisitor都是具體的Visitor對(duì)象,BusinessReport就是ObjectStructure。

訪問(wèn)者模式最大的優(yōu)點(diǎn)就是增加訪問(wèn)者非常容易,從代碼中可以看到,如果要增加一個(gè)訪問(wèn)者,則只要新實(shí)現(xiàn)一個(gè)訪問(wèn)者接口的類,從而達(dá)到數(shù)據(jù)對(duì)象與數(shù)據(jù)操作相分離的效果。如果不使用訪問(wèn)者模式,而又不想對(duì)不同的元素進(jìn)行不同的操作,則必定需要使用if...else和類型轉(zhuǎn)換,這使得代碼難以升級(jí)維護(hù)。

我們要根據(jù)具體情況來(lái)評(píng)估是否適合使用訪問(wèn)者模式。例如,對(duì)象結(jié)構(gòu)是否足夠穩(wěn)定,是否需要經(jīng)常定義新的操作,使用訪問(wèn)者模式是否能優(yōu)化代碼,而不使代碼變得更復(fù)雜。

2 從靜態(tài)分派到動(dòng)態(tài)分派

變量被聲明時(shí)的類型叫作變量的靜態(tài)類型(Static Type),有些人又把靜態(tài)類型叫作明顯類型(Apparent Type);而變量所引用的對(duì)象的真實(shí)類型又叫作變量的實(shí)際類型(Actual Type)。比如:

List list = null;
list = new ArrayList();

上面代碼聲明了一個(gè)變量list,它的靜態(tài)類型(也叫作明顯類型)是List,而它的實(shí)際類型是ArrayList。根據(jù)對(duì)象的類型對(duì)方法進(jìn)行的選擇,就是分派(Dispatch)。分派又分為兩種,即靜態(tài)分派和動(dòng)態(tài)分派。

2.1 靜態(tài)分派

靜態(tài)分派(Static Dispatch)就是按照變量的靜態(tài)類型進(jìn)行分派,從而確定方法的執(zhí)行版本,靜態(tài)分派在編譯期就可以確定方法的版本。而靜態(tài)分派最典型的應(yīng)用就是方法重載,來(lái)看下面的代碼。

public class Main {
    public void test(String string){
        System.out.println("string");
    }
    public void test(Integer integer){
        System.out.println("integer");
    }
    public static void main(String[] args) {
        String string = "1";
        Integer integer = 1;
        Main main = new Main();
        main.test(integer);
        main.test(string);
    }
}

在靜態(tài)分派判斷的時(shí)候,根據(jù)多個(gè)判斷依據(jù)(即參數(shù)類型和個(gè)數(shù))判斷出方法的版本,這就是多分派的概念,因?yàn)槲覀冇幸粋€(gè)以上的考量標(biāo)準(zhǔn),所以Java是靜態(tài)多分派的語(yǔ)言。

2.2 動(dòng)態(tài)分派

對(duì)于動(dòng)態(tài)分派,與靜態(tài)分派相反,它不是在編譯期確定的方法版本,而是在運(yùn)行時(shí)才能確定的。而動(dòng)態(tài)分派最典型的應(yīng)用就是多態(tài)的特性。舉個(gè)例子,來(lái)看下面的代碼。

interface Person{
    void test();
}
class Man implements Person{
    public void test(){
        System.out.println("男人");
    }
}
class Woman implements Person{
    public void test(){
        System.out.println("女人");
    }
}
public class Main {
    public static void main(String[] args) {
        Person man = new Man();
        Person woman = new Woman();
        man.test();
        woman.test();
    }
}

這段代碼的輸出結(jié)果為依次打印男人和女人,然而這里的test()方法版本,無(wú)法根據(jù)Man和Woman的靜態(tài)類型判斷,他們的靜態(tài)類型都是Person接口,根本無(wú)從判斷。

顯然,產(chǎn)生這樣的輸出結(jié)果,就是因?yàn)閠est()方法的版本是在運(yùn)行時(shí)判斷的,這就是動(dòng)態(tài)分派。

動(dòng)態(tài)分派判斷的方法是在運(yùn)行時(shí)獲取Man和Woman的實(shí)際引用類型,再確定方法的版本,而由于此時(shí)判斷的依據(jù)只是實(shí)際引用類型,只有一個(gè)判斷依據(jù),所以這就是單分派的概念,這時(shí)考量標(biāo)準(zhǔn)只有一個(gè),即變量的實(shí)際引用類型。相應(yīng)地,這說(shuō)明Java是動(dòng)態(tài)單分派的語(yǔ)言。

3 訪問(wèn)者模式中的偽動(dòng)態(tài)分派

通過(guò)前面的分析,我們知道Java是靜態(tài)多分派、動(dòng)態(tài)單分派的語(yǔ)言。Java底層不支持動(dòng)態(tài)雙分派。但是通過(guò)使用設(shè)計(jì)模式,也可以在Java里實(shí)現(xiàn)偽動(dòng)態(tài)雙分派。在訪問(wèn)者模式中使用的就是偽動(dòng)態(tài)雙分派。所謂動(dòng)態(tài)雙分派就是在運(yùn)行時(shí)依據(jù)兩個(gè)實(shí)際類型去判斷一個(gè)方法的運(yùn)行行為,而訪問(wèn)者模式實(shí)現(xiàn)的手段是進(jìn)行兩次動(dòng)態(tài)單分派來(lái)達(dá)到這個(gè)效果。

還是回到前面的KPI考核業(yè)務(wù)場(chǎng)景中,BusinessReport類中的showReport()方法的代碼如下。

public void showReport(IVisitor visitor) {
        for (Employee employee : employees) {
            employee.accept(visitor);
        }
}

這里依據(jù)Employee和IVisitor兩個(gè)實(shí)際類型決定了showReport()方法的執(zhí)行結(jié)果,從而決定了accept()方法的動(dòng)作。

accept()方法的調(diào)用過(guò)程分析如下。

(1)當(dāng)調(diào)用accept()方法時(shí),根據(jù)Employee的實(shí)際類型決定是調(diào)用Engineer還是Manager的accept()方法。

(2)這時(shí)accept()方法的版本已經(jīng)確定,假如是Engineer,則它的accept()方法調(diào)用下面這行代碼。

    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }
		

此時(shí)的this是Engineer類型,因此對(duì)應(yīng)的是IVisitor接口的visit(Engineer engineer)方法,此時(shí)需要再根據(jù)訪問(wèn)者的實(shí)際類型確定visit()方法的版本,如此一來(lái),就完成了動(dòng)態(tài)雙分派的過(guò)程。

以上過(guò)程通過(guò)兩次動(dòng)態(tài)雙分派,第一次對(duì)accept()方法進(jìn)行動(dòng)態(tài)分派,第二次對(duì)訪問(wèn)者的visit()方法進(jìn)行動(dòng)態(tài)分派,從而達(dá)到根據(jù)兩個(gè)實(shí)際類型確定一個(gè)方法的行為的效果。

而原本的做法通常是傳入一個(gè)接口,直接使用該接口的方法,此為動(dòng)態(tài)單分派,就像策略模式一樣。在這里,showReport()方法傳入的訪問(wèn)者接口并不是直接調(diào)用自己的visit()方法,而是通過(guò)Employee的實(shí)際類型先動(dòng)態(tài)分派一次,然后在分派后確定的方法版本里進(jìn)行自己的動(dòng)態(tài)分派。

注:這里確定accept(IVisitor visitor)方法是由靜態(tài)分派決定的,所以這個(gè)并不在此次動(dòng)態(tài)雙分派的范疇內(nèi),而且靜態(tài)分派是在編譯期完成的,所以accept(IVisitor visitor)方法的靜態(tài)分派與訪問(wèn)者模式的動(dòng)態(tài)雙分派并沒(méi)有任何關(guān)系。動(dòng)態(tài)雙分派說(shuō)到底還是動(dòng)態(tài)分派,是在運(yùn)行時(shí)發(fā)生的,它與靜態(tài)分派有著本質(zhì)上的區(qū)別,不可以說(shuō)一次動(dòng)態(tài)分派加一次靜態(tài)分派就是動(dòng)態(tài)雙分派,而且訪問(wèn)者模式的雙分派本身也是另有所指。

而this的類型不是動(dòng)態(tài)分派確定的,把它寫在哪個(gè)類中,它的靜態(tài)類型就是哪個(gè)類,這是在編譯期就確定的,不確定的是它的實(shí)際類型,請(qǐng)小伙伴們也要區(qū)分開來(lái)。

4 訪問(wèn)者模式在JDK源碼中的應(yīng)用

首先來(lái)看JDK的NIO模塊下的FileVisitor接口,它提供了遞歸遍歷文件樹的支持。這個(gè)接口上的方法表示了遍歷過(guò)程中的關(guān)鍵過(guò)程,允許在文件被訪問(wèn)、目錄將被訪問(wèn)、目錄已被訪問(wèn)、發(fā)生錯(cuò)誤等過(guò)程中進(jìn)行控制。換句話說(shuō),這個(gè)接口在文件被訪問(wèn)前、訪問(wèn)中和訪問(wèn)后,以及產(chǎn)生錯(cuò)誤的時(shí)候都有相應(yīng)的鉤子程序進(jìn)行處理。

調(diào)用FileVisitor中的方法,會(huì)返回訪問(wèn)結(jié)果的FileVisitResult對(duì)象值,用于決定當(dāng)前操作完成后接下來(lái)該如何處理。FileVisitResult的標(biāo)準(zhǔn)返回值存放在FileVisitResult枚舉類型中,代碼如下。

public interface FileVisitor<T> {
    FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
        throws IOException;
    FileVisitResult visitFile(T file, BasicFileAttributes attrs)
        throws IOException;
    FileVisitResult visitFileFailed(T file, IOException exc)
        throws IOException;
    FileVisitResult postVisitDirectory(T dir, IOException exc)
        throws IOException;
}

(1)FileVisitResult.CONTINUE:這個(gè)訪問(wèn)結(jié)果表示當(dāng)前的遍歷過(guò)程將會(huì)繼續(xù)。

(2)FileVisitResult.SKIP_SIBLINGS:這個(gè)訪問(wèn)結(jié)果表示當(dāng)前的遍歷過(guò)程將會(huì)繼續(xù),但是要忽略當(dāng)前文件/目錄的兄弟節(jié)點(diǎn)。

(3)FileVisitResult.SKIP_SUBTREE:這個(gè)訪問(wèn)結(jié)果表示當(dāng)前的遍歷過(guò)程將會(huì)繼續(xù),但是要忽略當(dāng)前目錄下的所有節(jié)點(diǎn)。

(4)FileVisitResult.TERMINATE:這個(gè)訪問(wèn)結(jié)果表示當(dāng)前的遍歷過(guò)程將會(huì)停止。

通過(guò)訪問(wèn)者去遍歷文件樹會(huì)比較方便,比如查找文件夾內(nèi)符合某個(gè)條件的文件或者某一天內(nèi)所創(chuàng)建的文件,這個(gè)類中都提供了相對(duì)應(yīng)的方法。它的實(shí)現(xiàn)其實(shí)也非常簡(jiǎn)單,代碼如下。

public class SimpleFileVisitor<T> implements FileVisitor<T> {
    protected SimpleFileVisitor() {
    }
    @Override
    public FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
        throws IOException
    {
        Objects.requireNonNull(dir);
        Objects.requireNonNull(attrs);
        return FileVisitResult.CONTINUE;
    }
    @Override
    public FileVisitResult visitFile(T file, BasicFileAttributes attrs)
        throws IOException
    {
        Objects.requireNonNull(file);
        Objects.requireNonNull(attrs);
        return FileVisitResult.CONTINUE;
    }
    @Override
    public FileVisitResult visitFileFailed(T file, IOException exc)
        throws IOException
    {
        Objects.requireNonNull(file);
        throw exc;
    }
    @Override
    public FileVisitResult postVisitDirectory(T dir, IOException exc)
        throws IOException
    {
        Objects.requireNonNull(dir);
        if (exc != null)
            throw exc;
        return FileVisitResult.CONTINUE;
    }
}

5 訪問(wèn)者模式在Spring源碼中的應(yīng)用

再來(lái)看訪問(wèn)者模式在Spring中的應(yīng)用,Spring IoC中有個(gè)BeanDefinitionVisitor類,其中有一個(gè)visitBeanDefinition()方法,源碼如下。

public class BeanDefinitionVisitor {
	@Nullable
	private StringValueResolver valueResolver;

	public BeanDefinitionVisitor(StringValueResolver valueResolver) {
		Assert.notNull(valueResolver, "StringValueResolver must not be null");
		this.valueResolver = valueResolver;
	}
	protected BeanDefinitionVisitor() {
	}
	public void visitBeanDefinition(BeanDefinition beanDefinition) {
		visitParentName(beanDefinition);
		visitBeanClassName(beanDefinition);
		visitFactoryBeanName(beanDefinition);
		visitFactoryMethodName(beanDefinition);
		visitScope(beanDefinition);
		if (beanDefinition.hasPropertyValues()) {
			visitPropertyValues(beanDefinition.getPropertyValues());
		}
		if (beanDefinition.hasConstructorArgumentValues()) {
			ConstructorArgumentValues cas = beanDefinition.getConstructorArgumentValues();
			visitIndexedArgumentValues(cas.getIndexedArgumentValues());
			visitGenericArgumentValues(cas.getGenericArgumentValues());
		}
	}
	...
}

我們看到,在visitBeanDefinition()方法中,訪問(wèn)了其他數(shù)據(jù),比如父類的名字、自己的類名、在IoC容器中的名稱等各種信息。

以上就是java訪問(wèn)者模式的靜態(tài)動(dòng)態(tài)及偽動(dòng)態(tài)分派徹底理解的詳細(xì)內(nèi)容,更多關(guān)于java訪問(wèn)者模式靜態(tài)動(dòng)態(tài)偽動(dòng)態(tài)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳談hibernate,jpa與spring?data?jpa三者之間的關(guān)系

    詳談hibernate,jpa與spring?data?jpa三者之間的關(guān)系

    這篇文章主要介紹了hibernate,jpa與spring?data?jpa三者之間的關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java讀文件修改默認(rèn)換行符的實(shí)現(xiàn)

    Java讀文件修改默認(rèn)換行符的實(shí)現(xiàn)

    這篇文章主要介紹了Java讀文件修改默認(rèn)換行符的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot實(shí)現(xiàn)發(fā)送郵件任務(wù)

    SpringBoot實(shí)現(xiàn)發(fā)送郵件任務(wù)

    這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)發(fā)送郵件任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 淺談java二進(jìn)制、十進(jìn)制、十六進(jìn)制、字符串之間的相互轉(zhuǎn)換

    淺談java二進(jìn)制、十進(jìn)制、十六進(jìn)制、字符串之間的相互轉(zhuǎn)換

    下面小編就為大家?guī)?lái)一篇淺談二進(jìn)制、十進(jìn)制、十六進(jìn)制、字符串之間的相互轉(zhuǎn)換。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • Spring注解解析之@ImportResource

    Spring注解解析之@ImportResource

    之前我們使用spring,最多的還是通過(guò)xml配置文件的方式來(lái)配置spring bean等內(nèi)容,隨著注解的廣泛應(yīng)用和spring4中Java config的引入,xml配置文件方式逐步被替換,但是如果是想要使用xml配置文件方式的話,也可以通過(guò)@ImportResource注解來(lái)實(shí)現(xiàn),下面我們來(lái)一起看下如何使用.
    2021-05-05
  • 基于spring 方法級(jí)緩存的多種實(shí)現(xiàn)

    基于spring 方法級(jí)緩存的多種實(shí)現(xiàn)

    下面小編就為大家?guī)?lái)一篇基于spring 方法級(jí)緩存的多種實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • 16進(jìn)制顯示字節(jié)流技巧分享

    16進(jìn)制顯示字節(jié)流技巧分享

    這篇文章主要介紹了16進(jìn)制顯示字節(jié)流的技巧分享,需要的朋友可以參考下
    2014-02-02
  • Java實(shí)現(xiàn)十進(jìn)制與二進(jìn)制互轉(zhuǎn)的示例詳解

    Java實(shí)現(xiàn)十進(jìn)制與二進(jìn)制互轉(zhuǎn)的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)十進(jìn)制與二進(jìn)制的互轉(zhuǎn),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下
    2022-11-11
  • Java實(shí)現(xiàn)HDFS文件上傳下載

    Java實(shí)現(xiàn)HDFS文件上傳下載

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)HDFS文件上傳下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 使用Criteria進(jìn)行分組求和、排序、模糊查詢的實(shí)例

    使用Criteria進(jìn)行分組求和、排序、模糊查詢的實(shí)例

    這篇文章主要介紹了使用Criteria進(jìn)行分組求和、排序、模糊查詢的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論