【问题标题】:How to make a public module that can do some common functions in java?如何制作一个可以在java中执行一些常用功能的公共模块?
【发布时间】:2011-04-26 19:06:21
【问题描述】:

如标题中所问,我可以在其中创建一个“普通”公共课程和一些 public static foo() 吗?谢谢!

【问题讨论】:

    标签: java function public


    【解决方案1】:

    简短易懂:是的。

    (但你为什么不简单地尝试一下?)

    【讨论】:

    • 谢谢!我已经尝试过了,它有效。但是,我只想找到其他可能性来满足它。以下答案给了我一些线索。
    【解决方案2】:

    一种常见的方法是像这样声明一个实用程序类

    package my.package;
    
    public class Utility {
    
      private Utility() {
      }
    
      public static void foo() {
      }
    
    }
    

    如果这个类在你的类路径中,你总是可以从任何地方做

    my.package.Utility.foo();
    

    【讨论】:

      【解决方案3】:

      是的,你可以。

      你认为困难在哪里?

      您可以在 Jakarta Commons Lang 中查看流行的实用程序类(例如 StringUtils)作为示例。您正在考虑的一些非常常见的功能可能已经存在于 Commons 系列库之一中。

      【讨论】:

      • 在面向对象编程中,对象是我们应该操作的第一件事,所以我关心的是:在不实例化真实对象的情况下使用public static function() 是否可以?非常感谢!
      • 是的,没关系。 OO 并不适合一切。或者更确切地说,在 StringUtils 的情况下,这些方法可能应该是 java.lang.String 上的方法,但由于它们不存在,所以你能做的最好的就是在其他地方使用静态方法。
      【解决方案4】:

      是的...你可以做到的..

      【讨论】:

        【解决方案5】:

        如果您对您的需求可能会改变,您可能需要不同版本的某些方法进行测试等有一点怀疑,那么请使用接口和类,例如:

        public interface Utils {
          public final static Utils INSTANCE = new MyUtils();
          Foo makeFoo();
          Bar transform(Foo foo) 
        }
        
        public class MyUtils implements Utils {
          public Foo makeFoo() { return new Foo(); }
          public Bar transform(Foo foo) { return new Bar(foo); } 
        }
        

        这使得切换到其他实现变得容易。当您决定开始使用像 Guice 这样的 DI 框架时,您遇到的问题会更少:

        public class Client {
          private final Utils util;
        
          @Inject
          Client(Utils utils) {  //<--- Here Guice will inject for you what you specified
            this.utils = utils; 
          }  
        }
        

        【讨论】:

        • 依赖注入对我来说是全新的想法,它太先进了,无法解决我的问题。 ^_^。谢谢!
        • 我的建议是独立于 DI 的,我把它作为另一个原因,当你不确定时应该避免使用实用程序类。如果没有 DI,您可以简单地编写 Utils.INSTANCE.makeFoo() 而不是 Utils.makeFoo(),它为您提供与普通实用程序类相同的功能,只是更灵活。
        • 对不起,您的意思是“没有 DI,我可以使用更简单的 Utils.INSTANCE.makeFoo()?我认为 Utils.makeFoo() 更简单。非常感谢!
        • 我不是说它更简单,我说它更灵活:更容易测试,如果你需要不同的实现也很容易重构等等。
        猜你喜欢
        • 2019-04-03
        • 2021-11-04
        • 2012-10-13
        • 2019-05-27
        • 1970-01-01
        • 2014-12-24
        • 1970-01-01
        • 1970-01-01
        • 2021-09-06
        相关资源
        最近更新 更多