private
中的 Java
提供了类级封装。是否可以封装对象?或者这样做是徒劳的吗?
例如,如果我们将一个类定义为,
public class Person {
private String ssn;
private ArrayList<Person> friends = new ArrayList<Person>();
public void addFriend (Person stranger) {
friends.add(stranger);
// but here I have access to her ssn
System.out.println(stranger.ssn);
}
}
当我要求将ssn
的对象作为参数传递给它时,如何屏蔽上述方法stranger
中addFriend()
stranger
的访问权限?< / p>
答案 0 :(得分:3)
private
表示您可以从该类访问该成员,而不仅仅是实例。
您只能从ssn
内访问Person
,而不能访问任何其他类型。你不能绕过这个来限制这个只是那个例子。
答案 1 :(得分:3)
封装的想法与数据安全性的想法不同。
封装用于改进程序。它提高了软件信任类合同的能力,并在没有错误的情况下获得预期结果,并且提高了抽象实现的能力,允许您以小单位进行思考,而不会因意外使用而产生副作用。
出于这个原因,它是在类级别实现的。如果您是程序员,通常应该能够相信自己或您的团队成员。这里有几个层次的信任,但我们再次谈到信任他们尊重班级的合同。
数据安全性应该在不同的级别上进行处理。例如,通过仅使用除了授权人员的计算机之外的任何地方都没有存储的安全密钥来加密敏感字段,以便只有该人才能访问它。
答案 2 :(得分:2)
Java没有“实例”私有访问修饰符,即。您可以限制只访问this
实例的字段/方法。
你可能不需要一个。你在Person
班。你是开发者。你需要隐藏什么?
答案 3 :(得分:2)
这种语言没有内置的机制。但是,您可以自己创建,通过添加一个应该可供每个人访问的方法的接口,同时将不可访问的成员保留到类型中,如下所示:
public interface Person {
int getID();
}
public class PersonWithSsn implements Person {
private int ID;
private String ssn;
private ArrayList<Integer> friends = new ArrayList<Integer>();
public int getID() {
return ID;
}
public void addFriend (Person stranger) {
friends.add(stranger.getID());
// You no longer have access to ssn here
//System.out.println(stranger.ssn);
}
}
答案 4 :(得分:1)
您可以通过单独封装定义,然后将正确的定义传递给方法来解决这个问题:
class Person {
private HiddenDefinitions hiddenDef;
private PublicDefinitions publicDef;
public void addFriend(PublicDefinitions def) {
}
}
class PublicDefinitions {
private String name;
private int id;
public int getId() {
return id;
}
public String getName() {
return name;
}
}
class HiddenDefinitions {
private String ssn;
private String getSSN() {
return ssn;
}
public void setSSN(String ssn) {
this.ssn = ssn;
}
}
这将确保您只在需要时传递公共信息。虽然它确实需要额外的类,但它可以防止其他示例破坏