Java后门接口,或,通过调用对象限制方法访问

Java后门接口,或,通过调用对象限制方法访问,java,hibernate,oop,Java,Hibernate,Oop,我正在使用Java。我想要一个类的setter方法,它只能被另一个类的“拥有”对象访问。我将更具体地说: 我有节点和端口接口。每个节点都有一组端口,每个端口都属于一个节点。可以启用或禁用端口,并使用简单的布尔属性进行处理。但是,我只想允许“拥有”端口的节点设置其启用/禁用属性。调用Node.fixYourPorts()时应该会发生这种情况(好的,它有一个不同的名称,但我试图简化) 因此,我希望每个人都能调用port.isEnabled(),但只有拥有节点才能调用port.setEnabled()

我正在使用Java。我想要一个类的setter方法,它只能被另一个类的“拥有”对象访问。我将更具体地说:

我有节点和端口接口。每个节点都有一组端口,每个端口都属于一个节点。可以启用或禁用端口,并使用简单的布尔属性进行处理。但是,我只想允许“拥有”端口的节点设置其启用/禁用属性。调用Node.fixYourPorts()时应该会发生这种情况(好的,它有一个不同的名称,但我试图简化)

因此,我希望每个人都能调用port.isEnabled(),但只有拥有节点才能调用port.setEnabled()

我可以想出一些方法来解决这个问题,但我不确定哪种方法最好,我担心我可能用错误的方式思考这个问题。迄今为止的想法:

  • 每个节点实现都需要在同一个包中有一个匹配的端口实现,PortImpl.setEnabled()将是包访问。不能保证一个节点不会更改另一个节点的端口,但这对我来说已经足够接近了。节点代码比任何可能获得端口实例的随机客户端代码更受我的控制

  • 不是编程到接口端口,而是编程到抽象基类AbstractPort,它是接口节点内的静态嵌套类。这个基类将提供setter方法,因此节点实现可以调用它。不确定这是否有效

  • 在所有这些之上编写另一层代码,客户机将无法穿透这些代码。将setEnabled添加到端口接口。顶部的代码层将确保setter不会暴露

  • 将setter添加到接口。如果您作为客户机自己启用或禁用端口,那么您需要为无法正常工作做好准备。为此添加注释

  • 由于使用Hibernate将节点和端口实现持久化到DB,这一切都变得复杂


    有什么帮助吗?

    您可以将
    端口
    公开给客户端类,并通过提供setter方法的附加接口将其公开给
    节点
    对象吗?e、 g.构建它的组件将创建(比如)一个
    可配置端口
    (扩展
    端口
    ),并将其传递给
    节点
    ,但将端口作为一个
    端口
    传递回客户端

    interface ConfigurablePort extends Port {
       void setValue();
    }
    
    // in some factory... Or perhaps in the Node itself?
    public Port createPortForNode(Node node) {
       ConfigurablePort port = new Port();
       node.setPort(port);  // as Configurable
       return port; // as immutable
    }
    

    因此,您在这里不必担心打包问题,也可以避免实现您不想实现的方法(甚至抛出异常)的麻烦。

    您可以将
    端口
    公开给客户机类,并将其公开给
    节点
    对象,并使用提供setter方法的附加接口吗?e、 g.构建它的组件将创建(比如)一个
    可配置端口
    (扩展
    端口
    ),并将其传递给
    节点
    ,但将端口作为一个
    端口
    传递回客户端

    interface ConfigurablePort extends Port {
       void setValue();
    }
    
    // in some factory... Or perhaps in the Node itself?
    public Port createPortForNode(Node node) {
       ConfigurablePort port = new Port();
       node.setPort(port);  // as Configurable
       return port; // as immutable
    }
    

    因此,您在这里不必担心打包问题,也可以避免实现您不想实现的方法(甚至抛出异常)的麻烦。

    对于本应具有较少访问权限的端口用户,使用仅提供某些方法的接口公开对象。

    对于本应具有较少访问权限的端口用户,请使用仅提供某些方法的接口公开对象。

    问题是,客户端离访问权限只有一步之遥。但是,这仍然是一个改进,因为客户必须有意获得setter的访问权限,而不是让setter坐在那里供他们使用。嗯…@Michael注意到,
    ConfigurablePort
    是包私有的,所以没有人可以在包之外向下转换到它。@Péter啊,是的,我现在明白了。有点像我的#1,只是你做了一个包私有接口而不是包私有方法。这很有帮助……你是否太担心人们会情绪低落。?如果你担心滥用,那么你会担心通过反射等方式访问吗?问题是,客户离访问权只有一步之遥。但是,这仍然是一个改进,因为客户必须有意获得setter的访问权限,而不是让setter坐在那里供他们使用。嗯…@Michael注意到,
    ConfigurablePort
    是包私有的,所以没有人可以在包之外向下转换到它。@Péter啊,是的,我现在明白了。有点像我的#1,只是你做了一个包私有接口而不是包私有方法。这很有帮助……你是否太担心人们会情绪低落。?如果你担心滥用,那么你是否担心通过反射等方式访问。?