zoukankan      html  css  js  c++  java
  • 从头认识java-1.3 隐藏具体实现

    这一章节我们来聊聊为什么需要隐藏具体实现。

    一般来说,编程分为类的创建者与类的使用者,创建者将一部分脆弱的代码隐藏起来,只暴露某些必须的方法给使用者,这样,创建者就可以根据需要修改隐藏部分,而不会影响使用者的调用。

    为什么需要隐藏具体实现。

    1)让使用者不能随意访问所有的代码。

    例如:

    package com.ray.ch01;
    
    public class Bird {
    
    	private String name;
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    }
    

    上面Bird类,我们隐藏了name这个属性,类的使用者只能通过getName这个方法取得或者setName这个方法操作,而不能对name直接进行任何操作,因为name这个属性相对脆弱,你改我改大家改,改到最后,name可能不是需要的结果,特别有些恶意的使用者,赋值null,这就麻烦了。

    反面例子:

    package com.ray.ch01;
    
    public class Bird {
    
    	public String name;
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	public static void main(String[] args) {
    		Bird bird = new Bird();
    		bird.name=null;
    	}
    
    }
    

    上面的代码直接把对象赋值名字为空,但是实际业务这个是不可能存在的,因此,暴露name这个属性对于我们后面的操作充满未知的风险。正确的做法如下:

    package com.ray.ch01;
    
    public class Bird {
    
    	private String name;
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		if (name!=null) {
    			this.name = name;
    		}else {
    			System.out.println("名称不能为空");
    		}
    	}
    	
    	public static void main(String[] args) {
    		Bird bird1 = new Bird();
    		bird1.setName(null);
    		Bird bird2 = new Bird();
    		bird2.setName("jack");
    	}
    
    }
    

    运行输出:

    名称不能为空


    上面的代码避免了名字为空的风险,隐藏了脆弱的代码,只暴露必须的代码方法。


    2)让创建者可以随意修改隐藏的代码。

    除了限制使用者,同时也方便创建者,我们只要返回相同的东西,中间怎么实现,随我们。

    例如:

    我们根据上面的代码进行改编。

    package com.ray.ch01;
    
    public class Bird {
    
    	private String name;
    
    	private String id;
    
    	private void setId() {
    		id = "123456";
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		setId();
    		if (name != null) {
    			this.name = name;
    		} else {
    			System.out.println("名称不能为空");
    		}
    	}
    
    	public static void main(String[] args) {
    		Bird bird1 = new Bird();
    		bird1.setName(null);
    		Bird bird2 = new Bird();
    		bird2.setName("jack");
    	}
    
    }
    


    我们在setName的同时也setId,虽然代码里面增加了很多,但是对于使用者而言,他是不知道的,他能够使用的和知道的跟上面的代码一样。


    最后,本来应该还需要聊一下怎样隐藏具体实现,但是这个话题太宽泛,而且一般都是需要根据需求来做的,所以不做展开。总之一句话:需求决定隐藏什么具体实现。


    总结:这一章节我们介绍了为什么需要隐藏具体实现。


    这一章节就到这里,谢谢。

    -----------------------------------

    目录



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    【k8s】Volume-persistentVolumeReclaimPolicy
    【k8s】Volume-pv
    【k8s】Secret-生成环境变量
    【k8s】Volume-nfs
    【k8s】Volume-hostPath
    【k8s】Volume-emptyDir
    【k8s】Volume-downwardAPI
    【k8s】Volume-Secret
    【k8s】Volume-ConfigMap-file
    SQL SERVER 列转行
  • 原文地址:https://www.cnblogs.com/raylee2007/p/4896704.html
Copyright © 2011-2022 走看看