我无法在谷歌上找到这个问题的答案,所以这里有。
是否可以使用静态对象,以便程序的其余部分可以引用该对象? 我不知道如何澄清我的问题,所以我只是展示示例代码。
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,并将其作为参数添加只是为每个构造函数添加一个参数。
由于
答案 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)
对于常量/不可变对象,使用静态实例是完全可以的。
至于可变对象,取决于。在具有一个线程的简单程序中,它运行良好。但是,如果是多线程或群集,则应谨慎使用单例或不使用单例。