我想知道什么时候使用静态方法?假设我有一个类,有几个getter和setter,一个或两个方法,我希望这些方法只能在类的实例对象上调用。这是否意味着我应该使用静态方法?

例子:

Obj x = new Obj();
x.someMethod();

或:

Obj.someMethod(); // Is this the static way?

我很困惑!


当前回答

当您希望能够在没有类实例的情况下访问方法时,请使用静态方法。

其他回答

静态的: Obj.someMethod

当你想要提供对方法的类级访问时,使用static,即在没有类实例的情况下,方法应该是可调用的。

在阅读了Misko的文章之后,我相信静态方法从测试的角度来看是不好的。相反,您应该使用工厂(可能使用像Guice这样的依赖注入工具)。

我如何确保我只有一个东西

只吃一种 问题是"我如何确保我 只吃一种东西”是很好的 回避了。实例化一个 单个ApplicationFactory在你的 主要的,结果,只有你 实例化所有的单个实例 你的独生子女。

静态方法的基本问题是它们是过程代码

静态方法的基本问题是 它们是过程代码。我没有 知道如何对过程代码进行单元测试。 单元测试假设我可以 实例化我的应用程序的一部分 在隔离。在实例化过程中 我将依赖项与 mock /友军替换 真正的依赖关系。与程序 编程没有什么可以“连接”的 由于没有对象,代码 数据是分开的。

我发现了一个很好的描述,当使用静态方法:

没有硬性的、写得很好的规则来决定什么时候使一个方法静态或非静态,但是有一些基于经验的观察,这不仅有助于使一个方法静态,而且还教会了什么时候在Java中使用静态方法。你应该考虑在Java中让一个方法是静态的:

If a method doesn't modify state of object, or not using any instance variables. You want to call method without creating instance of that class. A method is good candidate of being static, if it only work on arguments provided to it e.g. public int factorial(int number){}, this method only operate on number provided as argument. Utility methods are also good candidate of being static e.g. StringUtils.isEmpty(String text), this a utility method to check if a String is empty or not. If function of method will remain static across class hierarchy e.g. equals() method is not a good candidate of making static because every Class can redefine equality.

来源在这里

当您不想在代码中创建对象来调用方法时,只需将该方法声明为静态方法。因为静态方法不需要调用实例,但这里的问题是,并不是所有的静态方法都由JVM自动调用。此特权仅由main()节点享有。“public static void main[字符串…]方法,因为在运行时,这是方法Signature public“static”void main[], JVM寻求作为开始执行代码的入口点。

例子:

public class Demo
{
   public static void main(String... args) 
   {
      Demo d = new Demo();

      System.out.println("This static method is executed by JVM");

     //Now to call the static method Displ() you can use the below methods:
           Displ(); //By method name itself    
      Demo.Displ(); //By using class name//Recommended
         d.Displ(); //By using instance //Not recommended
   }

   public static void Displ()
   {
      System.out.println("This static method needs to be called explicitly");
   }
} 

输出: 这个静态方法由JVM执行 这个静态方法需要显式调用 这个静态方法需要显式调用 这个静态方法需要显式调用

一个经验法则:问问自己“即使还没有构造对象,调用这个方法有意义吗?”如果是这样,它肯定是静态的。

在Car类中,你可能有一个方法:

double convertMpgToKpl(double mpg)

...这将是静态的,因为有人可能想知道35英里/加仑转换成什么,即使没有人制造过汽车。但是这个方法(设置一个特定Car的效率):

void setMileage(double mpg)

...不能是静态的,因为在构造任何Car之前调用该方法是不可想象的。

(顺便说一下,相反的情况并不总是正确的:你可能有时有一个方法涉及两个Car对象,但仍然希望它是静态的。例如:

Car theMoreEfficientOf(Car c1, Car c2)

虽然这可以转换为非静态版本,但有些人会认为,由于没有“特权”选择哪个Car更重要,所以不应该强迫调用者选择一个Car作为调用方法的对象。不过,这种情况在所有静态方法中只占相当小的一部分。