5

我一直在使用几种调用方法的方法。最近,我一直在使用一个类的静态实例,我相信这是它的正确术语(如果我错了,请纠正我)。哪个更好(甚至提出想法),为什么?

我的第一种方法是简单的旧静态方法。

static void exampleMethod1(){}
static void exampleMethod2(){}

第二种方式(有人说这是一种改进)。

public class ExampleClass{

    public static ExampleClass instance;

    public ExampleClass(){
    instance = this;
    }

    public static ExampleClass getInstance(){
        return instance;
    }

    void exampleMethod1(){
        //code
    }

    void exampleMethod2(){
        //code
    } 

    // To call the method I simply getInstance().exampleMethod1    

}
4

4 回答 4

6

您要查找的术语是singleton

单例上的静态方法和实例方法都可以,但是请注意,静态方法的方法不能实现接口,所以如果需要实现接口,请使用单例。

例如:

public enum HelloWorld implements Runnable {
    INSTANCE;

    @Override
    public void run() {
        System.out.println("Hello, world!");
    }
}

// ...
new Thread(HelloWorld.INSTANCE).start();

如果你的 hello-world 代码在一个静态方法中,它就不能直接实现Runnable接口。

于 2013-08-22T18:07:33.897 回答
4

如果所有方法都是静态的,并且您不需要初始化类或具有类成员,那么只需创建一个静态实用程序类。

只有静态函数的静态类就可以了。

正如克里斯在我上面回答的那样,听起来你正在寻找一个单例,只有当你的类确实有非静态方面时才应该使用它,但你想限制它的实例数量。

public static class GeneralFunctions
{
    public static class ArrayFunctions
    {
         public static void OnArray{};
    }

    public static class PrintingFunctions
    {
        public static void PrintBuffer(byte[] buffer){};
        public static void PrintQword(ulong qword){};
    }
}
于 2013-08-22T18:10:52.263 回答
1

您可以拥有一个只有静态方法的类,并且这些方法可以(如果需要)使用类中的静态字段来存储它们的持久数据。或者您可以使用“单例”类实例对实例方法和实例字段执行大致相同的操作。

一般来说,如果你有一个只包含没有状态的方法的类(例如,Math 类),你应该使这些方法静态而不具有/允许实例。但是,如果方法必须具有某种共享状态,那么拥有某种“单例”实现可能更明智。

于 2013-08-22T18:18:37.233 回答
1

要制作正确的单例,您必须将构造函数设为私有。静态 final 声明确保在第一次加载类时初始化实例。这是在 Java 中创建单例的最简单方法,但请注意还有其他方法。

public class ExampleClass
{
    private final static ExampleClass instance = new ExampleClass();

    private ExampleClass()
    {
        // prevents instantiation
    }

    public static ExampleClass getInstance()
    {
        return instance;
    }

    void exampleMethod1()
    {
        //code
    }

    void exampleMethod2()
    {
        //code
    }     
}

获取类的实例:

ExampleClass exampleClass = ExampleClass.getInstance();
exampleClass.exampleMethod1();
于 2013-08-22T18:32:24.763 回答