首页 > 解决方案 > 可以将通用代码保留在单独的类中并在 java 中使方法静态吗?

问题描述

我想知道将公共代码保存在单独的类中并使方法静态化是否安全和良好的做法。
我有一个类 Car,它是根据其他类的输入构建的。在创建 Car 对象后,我需要应用一些后期构造处理。下面的例子。
Travel 类使用 Car 并调用 postConstructProcessing 方法。
每当创建汽车对象时,CarProcessor 类似地用于其他类。

我的问题是我是否应该在 CarProcessor 中将方法进程设为静态。

Class car{

  Type type;
  Int model

Car(Type t, int m){
...
...
}

;
....
...}

下面的代码类使用 Car 并调用 postConstructProcessing 方法

public class Travel {
    public void go(){
       ....
       ....
      Car c = new Car(t,m);
      new CarProcessor().process(c);
    }
}

class CarProcessor{
    public Car process(Car c){
      If(c.type.value.equals("ABC"){
         c.type.version=1.1;
      }
      if(c.model=5.7){
         c.price=50k
      }
    }
} 

我的问题是,将 CarProcessor 中的方法过程设为静态是否安全且是一种良好的做法。

标签: java

解决方案


一般来说,它不是很好。

最明显的问题是,如果您正在测试 go 方法,您如何替换/模拟 CarProcessor::process?

真正的问题是组织性的。当您下次编码并寻找您希望在“Car”或“go”中看到的功能时,您输入“car”。或“走”。进入您的 IDE 并点击 ctrl-space,您会希望看到所有有趣的方法。你怎么知道创建一个 CarProcessor 来继续?

不过,有些事情很难在 OO 中实现——尤其是实用程序。查看 java 库中的整个 Math 包。它充满了您刚刚调用的静态方法。一个 oo 狂热者会说这些都属于 Number 类(可能类似于“Number.math.sqrt()?”,但 java 没有走这条路——事实上他们甚至没有一个好的公共数字类(我们有一个,不好)--

但即使我们有像 String 这样的真实类,我们也倾向于“StringUtil”等。这导致了大量相互冲突的 String 的“Util”实现。在这种情况下,问题的一部分是 String 是不可变的,我们不能真正用方法回填它(可能是一件好事)。但总的来说,OO 不适用于通用实用程序方法。

函数(这是您提出的)并不出色,但被大量使用。如果您有能力修改您的业务类,那么这几乎总是更适合这种类型的代码。

澄清一下:函数不同于方法——方法作用于成员(类变量),函数是独立的(也可能是静态的)。

函数是组织中一种非常古老的方法。OO 是一种较新的方法,用于当大量功能变得难以管理(从概念上)时。


推荐阅读