我在课堂下面。
public class SomeClass {
private String name;
private String id;
private String access;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAccess() {
return access;
}
public void setAccess(String access) {
this.access = access;
}
public void doSomeFunctionality(){
//does some logic using name and id
}
}
现在我必须向客户端公开上面几个方法。我可以这样做。
public class SomeOtherClass {
private SomeClass someClass = new SomeClass();
public void setName(String name) {
someClass.setName(name);
}
public void setId(String id) {
this.setId(id);
}
}
通过这样做,我可以限制一个客户端无法访问的方法,并且只暴露所需的方法。现在客户端实例化 SomeClass 并将数据填充到 SomeOtherClass.java 的 someClass 属性中。
但是现在如何从SomeOtherClass.java获取填充数据?
public SomeClass getSomeClass() {
return someClass;
}
如果我提供getter方法来获取上面的SomeOtherClass.java中的SomeClass,那么即使是客户端也可以访问它,我不想这样做。
但是如果我可以直接填充someClass实例,那么我可以简单地在同一个实例上调用doSomeFunctionality()
。像getSomeClass().doSomeFunctionality();
我怎样才能克服上述情况?
谢谢!
答案 0 :(得分:0)
如果您创建一个由客户端将使用的类实现的接口,但是客户端使用该接口获得对该类实例化的引用,即使您具有公共属性,成员,... .etc。,客户端只能看到界面提供/定义的那些。
答案 1 :(得分:0)
不要在getter中返回SomeClass对象,只需为要提供的字段创建一个getter:
public String getName() {
return someClass.getName();
}
答案 2 :(得分:0)
您的问题似乎很困惑,但我认为这是您正在寻找的答案,
让客户获取信息的方法应该与让他们设置信息完全相同。你不应该提供对内部SomeClass的访问 - 这会破坏整个点。因此,如果要仅对name属性提供读写访问权限,则外部类应如下所示:
public class SomeOtherClass {
private SomeClass someClass = new SomeClass();
public void setName(String name) {
someClass.setName(name);
}
public String getName() {
return someClass.getName();
}
}
您不必使他们可以获得的属性与他们可以设置的属性相同。例如,您也可以允许他们“获取”ID,但不能设置它。如果您希望它们可以访问所有属性,请为SomeOtherClass中的所有属性提供getter。如果是这种情况,您可能需要考虑创建一个指定所有getter方法的接口,并由SomeClass和SomeOtherClass实现,两个类也实现了它们所需的setter方法。
如果您总是希望提供完整的“读取”访问权限但限制“写入”访问权限,还有其他体系结构方法,如果您要求我们可以进行访问。
答案 3 :(得分:0)
我建议考虑如何分别测试这里涉及的部分。如果我们看一下SomeOtherClass,我们马上就注意到它依赖于SomeClass - 这很好。不幸的是,您通过使用new运算符将依赖项硬连接到SomeClass。如果您使用了依赖注入框架(例如,Spring或Guice),您可以简单地让框架向SomeOtherClass提供一个完全配置的SomeClass实例,以便可以直接使用该实例,并且SomeClass不再创建自己的依赖项。 ,而是它开始做有用的工作。在SomeOtherClass中调用SomeClass上的new会阻碍您独立于SomeClass测试SomeOtherClass的能力 - 除非您使用类似PowerMock的东西,否则它会更好地用于紧急情况,例如当您无法控制第三 - 密码。希望能帮助到你!附:所有这些setter都没有你对SomeClass的依赖!