`
whotodo
  • 浏览: 168348 次
文章分类
社区版块
存档分类
最新评论

面向对象中的封装

 
阅读更多

我们做任何事都是不断积累经验,慢慢发现更好的方法来处理某一类问题。程序设计也是如此,我们现在所熟知的一些概念的由来也都是前辈程序员在从事软件开发活动中经验的累计。

如果我们在学习程序设计前并不知道函数的概念,只是按顺序的执行指令。代码写久了就一定想,为什么我要反复的敲打处理同一逻辑功能的这段代码呢?!而且,这个一段逻辑处理在整个程序中用到了多次,当它的逻辑需要改变的时候,我得分别找到这些代码段并修改。更糟糕的是,你很容易就落掉一处,留下bug。

前人也别这样的问题困扰,所以将这些功能一致的逻辑代码放到了一起,也就有了函数的概念。

这个概念慢慢演变和发展,后来就成了程序设计的准则之一。程序设计要尽可能地间接,不要让同一段逻辑出现在两处。

我们都知道封装是面向对象程序设计中的重要概念。Java中是通过private和protected访问修饰符来限定外部世界对类中的成员和方法的可见性类实现封装的。

1. 将属性封装

属性是变量,变量就是一段内存空间中所容纳的数据。如果外部类是到这个变量的存在并且可以访问这个变量,那它们就可以对这个变量随便赋值。而这不是我们想要的,这个属性是属于我们自己定义的类的,只有我们才知道它可以是什么样的值。即使外部可以对它赋值,我们要对这个将要赋给我们自己的属性的值进行合法性检测。

2. 将方法封装

外部不知道我们有这样的方法,这个方法是私有的,是我们属于我们自己的。我们在需要的时候修改逻辑。就像我们到饭店吃饭,通过代理(服务员)向厨师发了消息。厨师对外暴露一个做菜的这个方法公外界呼叫(传入菜名),但是具体怎么做,是他自己的事,我们外界并看不到这些方法而只关心我们知道的方法的返回值。

下面是代码演示:

package org.vhow.java.basic;

public class MyClass
{
	// Make the field invisible to other classed to avoid they change it, or
	// assign invalid value to it.
	private String myField;

	// Add a public method to let others can assign value to it.
	// we can add some logic here.
	public void setMyField(String str)
	{
		// My logic here. e.g. I can judge if the value to be assigned to
		// my field is valid or not.
		if (str.length() > 10)
		{
			this.myField = str.substring(0, 10);
		}
		else
		{
			this.myField = str;
		}
	}

	// Other classes can not see this method, so, you can change it as you want.
	private String myLogicMethod()
	{
		return this.myField;
	}

	// Since the other classes may use this method, i can not change it once
	// it is published.
	public String exposedMethod()
	{
		return this.myLogicMethod();
	}
}

package org.vhow.java.basic;

public class AppMain
{
	public static void main(String[] args)
	{
		MyClass myObject = new MyClass();
		myObject.setMyField("abcdefghijklmnopqrstuvwxyz");
		
		String str = myObject.exposedMethod();
		System.out.println(str);
	}
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics