【问题标题】:Java exclusive methods to other classes [closed]Java对其他类的专有方法[关闭]
【发布时间】:2016-03-19 05:31:19
【问题描述】:

在 Java 中有没有办法让某些类可以访问方法?

class CommonClass{
  void methodAvailableForClassA() {code goes here}
  void methodAvailableForClassB() {code goes here}
}
class A{
  CommonClass cc;
  public void useCC(){
    cc.methodAvalableForClassA();
  }
}
class B{
  CommonClass cc;
  public void useCC(){
    cc.methodAvalableForClassB();
  }
}

我要问的是是否有办法为某些类提供可用的方法

【问题讨论】:

  • 通过仔细安排你的类在包中的排序。有关 Java 访问控制的更多信息,请参阅this
  • 不是直接的,但是有很多方法可以实现类似的结果访问控制、内部类、接口等。取决于你要完成什么。
  • 我想要完成的是拥有一些 A 类专有的 CommonClass 方法和 B 类专有的一些方法
  • 听起来是个糟糕的设计,您可能应该将CommonClass 作为接口或抽象类,并对AB 类分别实现
  • 目前还不清楚您为什么要这样做。你能详细说明一下吗?

标签: java class methods


【解决方案1】:

正如我在 cmets 中所写,您没有提供足够的上下文,我怀疑这个问题可以通过更好的设计来避免。

也就是说,您可以通过overloading 使用不同类型的类的相同方法“破解”它,并让对象将自己发送到该方法:

class CommonClass{
    void methodAvailableForClass(A a) {...}
    void methodAvailableForClass(B b) {...}
}
class A{
    CommonClass cc;
    public void useCC(){
        cc.methodAvailableForClass(this);
    }
}
class B{
    CommonClass cc;
    public void useCC(){
        cc.methodAvailableForClass(this);
    }
}

【讨论】:

    【解决方案2】:

    这是X/Y Problem

    你问错了问题,你问的是一个不合适的解决方案,而不是问题。

    您应该将本地化到特定类特化或接口实现的方法与该实现一起保留。

    这被称为High Cohesion and Loose Coupling

    你正试图做与这两件事完全相反的事情,这不是一条走下去的好路。

    任何时候你有一些像CommonClass 这样的东西,你就会在完全不相关的东西上创建一个错综复杂的依赖关系。

    解决办法:

    那些为每个类专门化的方法应该归那些使用它们的类所有

    【讨论】:

      【解决方案3】:

      正如在别处提到的,你应该寻找松耦合——只要ClassAClassB 都知道CommonClass 你有强耦合代码并且你有这种问题。但是,如果您拆分代表 CommonClass 可能扮演的各种角色的单独接口,那么您可以将 CommonClass 的实例传递给 ClassAClassB 中的每一个,但作为单独角色的实例,它只提供客户端类访问特定方法。

      例如

       public interface RoleForA {
           void methodAvailableForClassA();
       }
      
       public interface RoleForB {
           void methodAvailableForClassB();
       }
      
       public class CommonClass implements RoleForA, RoleForB {
          ....
       }
      
       public class ClassA {
          private final RoleForA cc;
          public void useCC(){
              cc.methodAvailableForClassA();
          }
       }
      
       public class ClassB{
          private final RoleForB cc;
          public void useCC(){
              cc.methodAvailableForClassB();
          }
       }
      

      这里的主要警告是CommonClass 不应该只是各种不相关功能的垃圾场。它需要保持凝聚力,所以你应该只出于正确的理由这样做。其中一个例子可能是提供一个到CommonClassClassA 的只读接口和一个到ClassB 的只写接口。需要注意的另一件事是,所涉及的接口不应简单地针对 A/B 类用例进行定制,否则任何松散耦合都纯属虚幻。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 2021-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多