Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一个类只有一个实例,还是仅仅有一堆静态方法更好?_Java_Class_Methods_Static - Fatal编程技术网

Java 一个类只有一个实例,还是仅仅有一堆静态方法更好?

Java 一个类只有一个实例,还是仅仅有一堆静态方法更好?,java,class,methods,static,Java,Class,Methods,Static,我一直在使用几种调用方法的方法。最近,我一直在使用一个类的静态实例,我相信这是一个恰当的术语(如果我错了,请纠正我)。哪一个更好(甚至是建议),为什么 第一种方法是简单的静态方法 static void exampleMethod1(){} static void exampleMethod2(){} 第二种方式(有人说这是一种改进) 你要找的术语是单身 单例上的静态方法和实例方法都是不错的方法,但请注意,静态方法方法无法实现接口,因此如果需要实现接口,请使用单例 例如: public enu

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

第一种方法是简单的静态方法

static void exampleMethod1(){}
static void exampleMethod2(){}
第二种方式(有人说这是一种改进)


你要找的术语是单身

单例上的静态方法和实例方法都是不错的方法,但请注意,静态方法方法无法实现接口,因此如果需要实现接口,请使用单例

例如:

public enum HelloWorld implements Runnable {
    INSTANCE;

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

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

如果您的hello world代码位于静态方法中,它将无法直接实现
Runnable
接口。

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

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

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

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){};
    }
}

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


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

要创建适当的单例,必须将构造函数设置为私有。静态最终声明确保在第一次加载类时初始化实例。这是在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();

类的静态实例不是正确的表达式。这将描述引用某个实例的类的静态字段。你说的是在类类型上静态调用的方法。谢谢,我不太确定这个术语是什么。“公共静态实例”;这是什么直接或间接的意思。无数据类型:在实例化对象时,在构造函数中指定数据类型。@Jaccob该声明中缺少该类型<代码>公共静态???实例应该是
公共静态ExampleClass实例哈哈,有人告诉我,拥有这样的静态实用程序类是“糟糕”的编程。我从未想过使用枚举来实现它,尽管我确实使用它们来实现Comparator。酷:)@StormeHawke它被称为“enum singleton模式”,在本文的第3项中有描述。这本书很值得一读,我认为每个Java程序员都应该读一读-D@StormeHawke从28:50开始。拥有一个单例从来都不是“明智的”,如果必须的话,这是最后的选择。我认为将它变成一个非静态类可能是一个好主意,即使没有状态,如果可以想象,在将来的某个时候实现可能会更改为一个需要状态的类。然后,如果确实发生了这种情况,您就不必更改使用该类的所有代码。数学课将是一个例子,在这个例子中,不可能想象国家会被需要。但这实际上取决于类代表什么以及其中的方法是用来做什么的,当然,我们不能用
ExampleClass
@TomF这样的类来判断,单例有几个优点。例如,您可以很容易地(并且可以配置地)将一个singleton子类化,这对于一个全静态类来说是很尴尬的。(但我确实认为,单身人士往往是首选的,当有很多更好的选择时,但这与静态方法无关。)我目前主要工作在C++嵌入式系统中,所以请相信我,我知道我在一个单身圈的路上。不过,除非你需要单例,否则你不应该使用单例,因为它“容易”或“可读”。@TomF-奇怪的是,我很少需要使用它们。最简单的方法是使用
枚举,就像Chris在回答中所做的那样。多线程应用程序无需担心。
ExampleClass exampleClass = ExampleClass.getInstance();
exampleClass.exampleMethod1();