2015-05-17 77 views
-1

试图想出一个好的策略来解决我的问题。问题是我有一个包含私有构造函数和静态方法的最终类。为了使用任何静态方法,我必须初始化类的一个实例。因为我在构造函数中有方法需要的数据才能起作用。具有静态方法和私有构造函数的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()调用另一个类的方法,我无法明确地获取数据;因为数据不存在。

我想知道有没有什么好的方法来获取数据而不把数据放在静态方法中?

+2

请张贴您的代码。 – Timo

+1

*因为我在构造函数中有[static]方法需要的数据* - 您打算如何从* static *方法访问该实例数据?你的问题不是很清楚,因为它似乎基于一个不可能的前提。 –

+3

我很确定你正在做面向对象编程错误...:D –

回答

1

为了使用任何的静态方法我必须初始化类的 实例。因为我在构造函数中有数据,因此 方法需要才能运行。

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

为你写的每类中,有两种可能的数据结构:

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

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

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

我不能明显地获得数据,如果我打电话从另一个 类的方法,通过StackOverFlow.getHello();

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

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

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

0

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

class MyClass { 
    public static int myMethod() { ... } 
} 

调用应该是:

int result = MyClass.myMethod(); 
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()

相关问题