4

我在谷歌上真的找不到这个问题的答案,所以就这样吧。

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

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 在整个程序中都使用,将其作为参数添加只是为每个构造函数添加一个参数。

谢谢

4

8 回答 8

6

取决于不止一件事...

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

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

3)设计你真的需要它吗?像争论一样传递它比在任何时候都绝对访问它更干净吗?

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

于 2013-06-24T14:30:17.447 回答
1

要了解在您的情况下是否可以使用单例模式,您应该问“该组件在应用程序的生命周期内是否保持不变?”,如果是,那么最好将它单独隔离在一个类中。

于 2013-06-24T14:28:09.740 回答
1

您所描述的称为单例模式。尽管有一些批评者,但它是一种经常使用的模式。

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

于 2013-06-24T14:28:36.967 回答
0

可以这样做。阅读有关单例模式的信息会对您有所帮助

于 2013-06-24T14:26:39.403 回答
0

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

于 2013-06-24T14:27:00.320 回答
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();
于 2013-06-24T14:30:08.087 回答
0

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

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

于 2013-06-24T14:30:40.300 回答
0

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

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

于 2013-06-24T14:37:27.967 回答