只能访问一个类的几个属性?

时间:2014-02-03 14:16:54

标签: java composition

我在课堂下面。

SomeClass.java

   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

       }



}

现在我必须向客户端公开上面几个方法。我可以这样做。

SomeOtherClass.java

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(); 我怎样才能克服上述情况?

谢谢!

4 个答案:

答案 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的依赖!