如何使用封装使代码更易于维护和重用?

时间:2013-03-09 04:35:18

标签: java encapsulation getter-setter

请展示一个示例,说明如何使用封装来演示代码可维护性?

为什么要使用getter和setter方法?

3 个答案:

答案 0 :(得分:2)

基本思想是为您的类的用户提供所有必要的操作(类方法),而不是让他完全访问数据(类变量)。此技术可防止对类变量和数据不一致的任何意外修改。例如:假设您有一个名为Student

的班级
Class Student {

       private:
            int id; 
            string name;
       public:
            SetStudenDetails( int i, string n);
            PrintStudentDetails();
     };

使用Get方法,您可以确保该类的用户同时提供名称和ID。

我建议你阅读Timothy Budd撰写的面向对象编程书。

答案 1 :(得分:1)

想象一下,我们都为同一个项目工作,首先你为一个类编写了代码,然后我在我的程序中使用了你的类。后来,你不喜欢这个类的行为方式,因为它的一些实例变量(由我从我的代码中设置)到你没有预料到的值。他们的代码在您的代码中带来了错误。 (放松,我不会这样做,不要担心。)因为它是一个Java程序,所以你应该只能发布一个更新版本的类,我可以在我的程序中替换它而不更改任何我自己的代码

上述场景突出了两个承诺,或者我应该说面向对象(OO)的好处:灵活性和可维护性。但这些好处不会自动产生。你必须做点什么。您必须以支持灵活性和可维护性的方式编写类和代码。仅仅因为Java支持OO概念,它无法为您编写代码。它可以??例如,假设您使用公共实例变量创建了类,而其他程序员直接设置了实例变量,如下面的代码所示:

public class BadExample {
public int size;
public int weight;
...
}
public class AnotherBadExample {
public static void main (String [] args) {
BadExample b = new BadExample ();
b.size = -5; // Legal but bad!!
}
}

现在回过头来讨论一段时间的情景。 BadExample是您的类,AnotherBadExample是我的代码。我修改了你的一个变量,它有助于我的代码逻辑,但完全改变了你的类的工作方式。现在你遇到了麻烦。你怎么改变你的课程,没有人可以直接改变你的价值观(就像我在我的代码中所做的那样)?你唯一的选择是在你的类中写一个方法说setSize(int newVal),然后将变量大小的访问修饰符更改为private。当有人试图将值设置为您不想要的大小变量时,这将确保您处理实例,同时确保没有人可以直接访问大小变量并弄乱您的代码。

但是,不幸的是,通过这样做,你破坏了我的代码。如果我尝试编译我的AnotherBadExample类,我将得到错误,因为我不再看到size变量。

我们现在如何处理这种情况?最好的方法是:不要编写公共变量可供任何人和每个人修改的代码。

在不破坏使用代码的所有其他人的代码的情况下更改代码的能力是封装的关键优势。您应该始终隐藏实现细节。要详细说明,您必须始终将变量设置为私有,然后使用一组公共方法,其他人可以使用这些方法来访问变量。由于方法是公开的,任何人都可以访问它们,但由于它们在您的课程中,您可以确保代码以最适合您的方式工作。因此,在您想要更改代码的情况下,您所要做的就是修改您的方法。没有人受伤,因为我只是在我的代码中使用你的方法名称,你的方法中的代码不会打扰我。

如果您想要可维护性,灵活性和可扩展性(我想,您确实如此),您的设计必须包含封装。你是怎样做的? •保持实例变量受保护(使用访问修饰符,主要是私有)。 •创建公共访问器方法,并强制调用代码使用这些方法而不是直接访问实例变量。 •对于方法,请使用set和get。

的JavaBeans命名约定

我们称访问方法为getter和setter,尽管有些人更喜欢更高级的访问者和mutator。 (就个人而言,我将使用术语getter和setter)无论你想要什么称呼它们,它们都是其他程序员必须经历的方法才能访问你的实例变量。它们看起来很简单,如果你一直在编写java代码,你可能永远都在使用它们:

public class GoodExample {
// protect the instance variable only an instance of your class can access it
private int size;
// Provide public getters and setters
public int getSize() {
return size;
}
public void setSize(int newSize) {
size = newSize;
}
}

你现在可能正在咕噜咕噜地说,让方法什么也不做,只是设置或获取值有什么好处。我宁愿有一个公共变量。如果你这样做,请转到Encapsulation下的第一段并重新阅读整个内容。如果你不这样做但是问我,我们应该在setSize()方法中有哪些验证码以确保没有人将它修改为无效值,我的朋友这只是一个示例类。我让你思考实施的必要性。由于像我这样的人和你一起编码或者更糟糕,你至少不会受到意外冲击的接收!{/ p>

参考:http://wiki.answers.com/Q/What_is_encapsulation_and_why_is_encapsulation_important_in_java_programming

答案 2 :(得分:0)

封装是信息隐藏。它可以通过java中的访问修饰符来实现 (私有,公共,受保护,默认)。因此,通过使用访问修饰符,我们可以对变量和方法的可见性施加限制。

封装还包含与单个类中的实体相关的函数和变量。

Getter和setter方法用于从外部访问类的实例变量,从而保护实例变量的直接访问。