关于java

时间:2015-05-16 13:04:58

标签: java oop encapsulation

我经历了几个博客,我得到了以下积分。 Encapsulation Blog

  1. 不要将字段公开为public,因为任何其他类都可以直接修改变量。
  2. 使用getter和setter来修改变量。
  3. 通过在getter和setter中包含验证,我们可以控制变量不会被直接修改。
  4. 我在这里有点困惑。

    考虑名称和地址作为其字段的EmployeeOrganizationOrganization2类会为员工变量分配值并打印相同的内容。

    public class Employee {
    
        public String name;
        public String address;
    
        public void printEmpDetails() {
            System.out.println("Employee name :" + name + ", Employee address :"
                    + address);
        }
    }
    
    public class Organization {
    
        public static void main(String[] args) {
             System.out.println("Employee details of org");
    
             Employee emp = new Employee();  //New Instance variable created
             emp.name= "JOHN";
             emp.address = "JOHN ADDRESS";     
    
        }
    }
    
    public class Organization2 {
    
        public static void main(String[] args) {
             System.out.println("Employee details of org2");
    
             Employee emp = new Employee();  //New Instance variable created
             emp.name= "JAMES";
             emp.address = "JAMES ADDRESS";     
    
        }
    }
    
    1. Organization正在创建一个员工实例(将自己的一组值分配给员工)
    2. 同样Organization2也在创建一个员工实例(将自己的一组值分配给员工)
    3. 问题: 因为它是两个不同的实例。封装是如何违反的?

5 个答案:

答案 0 :(得分:2)

Employee级违反了封装。变量nameaddress是公开的。它们应该private,并且应该为它们定义getter和setter。

答案 1 :(得分:1)

重点是不要将类内部暴露给外部。此规则需要为您的代码提供灵活性。

在您的代码中,您可以直接访问OrganizationOrganization2Employeepublic class Employee { private String name; private String address; public String getName() { return this.name; } public String getAddress() { return this.address; } public void setName(String newName) { this.name = newName; } public void setAddress(String newAddress) { this.address = newAddress; } } 类。而不是那样,建议为两个变量声明setter和getter。

name

请注意,字段addressname被声明为私有。

例如,如果您重新设计了Employee类的内部结构,则只需要重写getter和setter。所有其余代码都不需要干预。

如果您直接访问addressEmployee字段,则需要重写所有访问这些变量的代码,以防您更改这些变量名称,甚至使用其他数据源,而不是这些变量。

<小时/> 更新№1

在您的情况下,封装意味着您需要在此类中隐藏Employee类的实现。公开变量名称会暴露您的类的内部结构,并且与您的Employee类交互的所有代码都严格限制在您的Employee类结构中。

假设以下情况。您的客户现在要求您修改name课程的内部结构。您应该只存储客户ID(新的类字段),但应从数据库中读取addressname

如果你有getter和setter,你只需要重写这些Employee类的getter和setter。您的外部代码不会注意到此更改。

但如果您直接访问addressOrganization,则需要更改Organization2和{{1}}类中的代码。

现在假设您有300个类,它们可以直接相互访问。

<小时/> 更新№2

当我不在的时候你在聊天中的问题:

谢谢这是我在抽象和封装上的未知。以汽车为例本身抽象 - 隐藏汽车中某个功能的内部工作。 Say Break系统 - 汽车制造商告诉你 - 如果你按下break,它会停止(这里我们隐藏了破坏系统是如何工作的)封装 - 提供一个公共接口来访问休息时间。汽车用户应该使用该特定的公共界面来操作休息时间。作为制造商,我可以决定当用户应用中断时要实现的逻辑,并且此逻辑在将来可能会发生变化,而无需用户注意。

我的回答:

是的,制造商只提供公共接口(断路踏板),驱动程序不应该担心系统的内部机制。如果制造商决定改变机制,他需要保留公共接口(断开踏板),并且可以改变机制的内部。并且司机不会注意到这种变化。相同的方法适用于编程类。如果隐藏(封装)类的内部,则可以使应用程序更易于维护和灵活。

答案 2 :(得分:0)

封装的目的不是为了防止不同的实例相互影响,而是要明确区分哪个类拥有数据以及与之相关的逻辑应该在哪里。

例如,假设您要向Employee引入一个附加属性,其中包含重命名的次数。如果您将数据成员公开为public,则使用Employee的每个组织类都需要记住更新此新属性。

但是,如果您的数据成员是私有的,而其他类只能使用类&#39;来操作它们。方法,您可以确保在类中封装这个逻辑:

public class Employee {

    private String name;
    private int numRenames = 0;

    public String getName() {
        return name;
    }

    public in getNumRenames() {
        return numRenames;
    }

    public void setName(String name) {
        this.name = name;
        ++numRenames;
    }

    // rest of the class snipped
}

答案 3 :(得分:0)

封装的基本概念是隐藏实现。虽然您可以执行相同的工作,使字段公开,但您可以直接访问该类的实现。这就是为什么据说使用getter,setter方法。

但这一切都取决于你想要做什么。有时提供直接访问可能更好,而无需实现任何getter,setter方法

答案 4 :(得分:-1)

这听起来像是家庭作业。但是,我心情很好,所以我仍然会帮助你:)

  

不要将字段公开为public,因为任何其他类都可以直接修改变量。

public class Employee {

public String name;
public String address;

字段为public,因此会破坏封装。