在Java中使用静态实例是否合理?

时间:2013-06-24 14:23:26

标签: java parameters static constructor client

我无法在谷歌上找到这个问题的答案,所以这里有。

是否可以使用静态对象,以便程序的其余部分可以引用该对象? 我不知道如何澄清我的问题,所以我只是展示示例代码。

public class Client {

    Frame f;
    private static Client mainClient;

    public static void main(String[] args){
        new Client().init();
    }

    private void init(){

        mainClient = this;
        f = new Frame();

    }

    public static Client getClient() {
        return mainClient;
    }

    public Frame getFrame(){
        return f;
    }   
}

那么,在整个程序中使用getClient()方法来访问Frame对象是否可以接受,而不是将其作为参数发送给我创建的(大多数)对象?在整个程序中使用Frame,并将其作为参数添加只是为每个构造函数添加一个参数。

由于

8 个答案:

答案 0 :(得分:6)

取决于不止一件事......

1)用法。您是否希望能够说MyClass.getClient()并获取对Client变量的引用? 如果你的目标是单一的东西 - 是的。如果你的目标是一个非常方便的东西 - 是的,如果安全的话,如果你只是希望它随处可见 - 不。如果从错误的地点/时间访问它会导致崩溃和错误 - 没有。

2)人们会使用你所暴露的任何东西,期间。如果他们看到你的代码像这样提取客户端,他们也会在不合适时使用它,那么它会导致很多错误吗? :)

3)设计你真的需要吗?将参数传递给参数比在任何时候绝对访问它更清晰吗?

在衡量之后,你决定了。这看起来像它构建和工作正常。但是,任何需要这种不受限制的访问(上面提到的任何时间访问)到运行时特定的东西可能不是最好的方法;对家庭作业有用的可能不适用于企业软件。

答案 1 :(得分:1)

要了解在您的情况下是否可以使用Singleton模式,您应该问“在应用程序的生命周期内该组件是否保持不变?”,如果是,则可能最好将其隔离在类中它自己的。

答案 2 :(得分:1)

您所描述的内容称为singleton pattern。虽然有一些批评者认为它是一种经常使用的模式。

将对象提供给每个构造函数的第二种方法是dependency injection框架。对于Java,最好的选择之一是Spring

答案 3 :(得分:0)

这样做是可以的。阅读singleton pattern

对您有所帮助

答案 4 :(得分:0)

你基本上都在问是否可以使用单例模式。当然是啦。但问题是您必须确保不在非GUI线程中执行GUI操作。通过允许访问Frame类,您可以打开它以防止可能的滥用。我假设你是唯一的程序员,所以只要小心处理它。

答案 5 :(得分:0)

您刚刚创建了SingleTon Pattern的变体。当整个项目中只需要该对象的一个​​实例时,将使用静态对象。

单身人士的基本结构是

public class Client {
    private static Client mainClient;


    private void Client (){
         // do initial tasks
    }

    public static Client getClient() {
        if(mainClient == null)
            mainClient = new Client();
        return mainClient;
    }

    public Frame getFrame(){
        return f;
    }   
}

所以你可以使用

获取框架
Client.getClient().getFrame();

答案 6 :(得分:0)

嗯,这种单例模式的实现是我最讨厌的。好吧,它很容易编码,但是稍后,如果必须更改某些内容,则必须在百万个地方进行更改。对于单例模式,我将使用依赖注入 - 控制反转模式与 Singleton factory 模式,并将static变量专门用于常量 (例如,字符串,整数......)。

关于你的问题,一切都是可以接受的。实施取决于您的项目要求。

答案 7 :(得分:0)

对于常量/不可变对象,使用静态实例是完全可以的。

至于可变对象,取决于。在具有一个线程的简单程序中,它运行良好。但是,如果是多线程或群集,则应谨慎使用单例或不使用单例。