使用静态方法和私有构造函数的final类?

时间:2015-05-17 22:14:10

标签: java

试图找出解决问题的好策略。问题是我有一个包含私有构造函数和静态方法的final类。为了使用任何静态方法,我必须初始化类的实例。因为我在构造函数中有数据所需的方法才能运行。

那么,为什么我要将方法设为静态?因为1)项目非常大,我需要例如MyClass.AccessThis()和2)比创建实例和调用方法更容易。

编辑:我的意思2)是如果我将我的所有方法都转换为非静态的公共构造函数,那么我可以在任何类中创建类的实例并使用我的方法。

编辑2:就这样吧。

public final class StackOverFlow {

private static Map<String, String> map = new HashMap<String, String>();

    private StackOverFlow() {

        map.put("hello", "hello");
    }

    public static String getHello()    {
        return map.get("hello");
    }
}

如果我通过StackOverFlow.getHello()从另一个类调用该方法,我显然无法获取数据;因为数据不存在。

我想知道有没有什么好方法可以在不将数据放入静态方法的情况下获取数据?

3 个答案:

答案 0 :(得分:1)

  

为了使用我必须初始化的任何静态方法   班级的实例。因为我在构造函数中有数据了   方法需要才能发挥作用。

没有。这是不正确的。这不是静态方法的工作方式。

对于您编写的每个类,有两种可能的数据结构:

  • 类对象。每个类都有一个关联的Class对象。
  • 实例。类可以选择也有实例(由类定义)

静态方法和字段与Class对象相关联。它们独立于任何实例。因此,静态成员无法访问属于实例的任何数据。相反,任何实例都可以访问属于该类对象的任何静态成员。

您绝对可以使用类中定义的所有可访问静态方法,而无需使用它的初始化实例(因为静态成员属于Class对象而不属于任何实例)。

  

如果我从另一个方法调用该方法,我显然无法获取数据   class by StackOverFlow.getHello();

     

我想知道是否有任何好的方法来获取数据而不放   静态方法中的数据?

哦,是的,你可以。数据属于Class对象StackOverflow。任何可以访问StackOverflow类并且可以访问其方法的对象都可以获取您的数据,无论它在您的项目中的哪个位置。静态字段是一种全局数据。在您的情况下,与StackOverflow在同一.class文件中的任何方法都可以到达您的地图对象。

当然还有其他方法。您可以为您的项目提供一个良好的数据模型。例如,您可以将数据放在单个对象的实例中,该对象的引用将传递给其他方法。

答案 1 :(得分:0)

如果您创建静态方法,则可以在不初始化的情况下调用它。 例如:

int result = MyClass.myMethod();

电话应该是:

{{1}}

答案 2 :(得分:0)

这可能就是你要找的,静态初始化:

public final class StackOverFlow {

    // remove the final if you have methods modifying the map
    private static final Map<String, String> map = new HashMap<String, String>();
    static {
        map.put("hello", "hello");
    }

    public static String getHello() {
        return map.get("hello");
    }

}

就像你一样,你永远不需要创建一个对象来访问getHello()