【问题标题】:How can I group static methods in a class in a clean way如何以干净的方式将类中的静态方法分组
【发布时间】:2014-11-30 16:52:30
【问题描述】:

我想在应用程序范围的 bean 中公开一堆 JSF 中的通用静态方法。现在我的代码如下:

@ApplicationScoped
@Named
public class StaticUtils{

     public static void bla(){ ... }

     public static void blabla(MyParam param){ ... }

     public static void bla2(){ ... }

     public static void blabla2(MyParam param){ ... }

     ...
}

问题是我的 bean 增长太多了,我有一些彼此不需要的方法。因此,我正在考虑按功能将它们组合在一起并将它们提取到其他类中。之后,通过组合,我将在上述 ApplicationScopedBean 中拥有每个类的实例,并通过包装方法访问我分组的静态方法。

public class A{

     public static void bla(){ ... }

     public static void blabla(MyParam param){ ... }

     ...
}

public class B{

     public static void bla2(){ ... }

     public static void blabla2(MyParam param){ ... }

     ...
}

@ApplicationScoped
@Named
public class StaticUtils{

     public static void bla(){ A.bla(); }

     public static void blabla(MyParam param){ A.blabla(param); }

     public static void bla2(){ B.bla2(); }

     public static void blabla2(MyParam param){ B.blabla2(param); }

 }

由于多重继承在 java 中直接不可用,我既不想对所有生成的 bean 使用多级继承也不想使用 @ApplicationScoped,有没有更好/更干净/更简洁的方法来做到这一点?我可以自动从类中的内部对象公开所有公共方法,这样我可以使其代码或多或少像这样短吗?

@ApplicationScoped
@Named
public class StaticUtils{

   private A a;

   private B b;

   ...
 }

有什么想法吗?提前致谢

【问题讨论】:

    标签: java static-methods


    【解决方案1】:

    简短的回答是:不,你不能。但是,您可以做几件事:

    • 您可以为每个功能类使用一个接口,并让您的AB 或其他任何东西以及您的StaticUtils 实现这些接口中的每一个。然后在StaticUtils 类中你可以有类似的东西

      public static void bla() {
          A.bla();
      }
      
    • 如果这些函数都是静态的,你实际上可以使用静态导入,不需要 bean:

      import static org.bla.A.bla;
      import static org.bla.B.*;
      // etc.
      
    • 如果您想使用 bean,那么您可以拥有多个(AB、...),而不仅仅是 StaticUtils 类。如果功能未连接,那可能是最干净的解决方案。
    • 您可以按照 Predrag Maric 的建议执行操作,只需将 AB 等实例作为 StaticUtils 类中的公共成员。

    【讨论】:

    • 首先感谢您的建议:-Pedrag,如果我可以更改 xhtml 代码中的调用,那将很合适,但是有很多代码不在我的监督下,依赖于相同的代码后端,这就是为什么我要保持调用相同的原因:
      @DavidP 如果您不能更改 XHTML,那么恐怕您会得到一个冗长的解决方案,无论您选择哪种解决方案。调用的设计不允许其他任何事情。
    • 我同意@blalasaadri,这是一个很大的限制。你可能找不到任何你已经拥有的更清洁的东西。
    【解决方案2】:

    这样的事情呢

    public class StaticUtils{
    
       public static A a;
    
       public static B b;
    
       ...
     }
    

    这样,您可以访问例如 A 的方法,例如 StaticUtils.a.bla()

    【讨论】:

    • 可能这些成员甚至可能是final,否则它们可以在 bean 中更改(这可能是不需要的)。
    • 我同意,但重点是可见性和类结构
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签