S.O.S -- Singleton(单态)模式的静态属性问题

海盗2019 2004-10-11 11:45:49
Config类使用了单态模式,定义如下:
private Config(){}
private static Config instance = new Config();
public static Config getInstance()
{
  return instance;   
}
static Vector v[];
ConfigRow find(key){...};
boolean addOne(Object obj){...};
boolean removeOne(Object obj){...};

ConfigRow 是一个数据bean,Confirm继承了Config,外部类通过 new 一个 Confirm调用Config的方法。

我想问的是:如果有多个地方都new Confirm的话,内存中有积分Vector[] v 存在? 操作任何一个addOne的话,上面哪些调用的地方会不会互相印象?

我觉得是,向各位确认一下,多谢!
...全文
169 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
shangqiao 2004-10-11
  • 打赏
  • 举报
回复
你的构造子全是private,就没有办法extend
sagittarius1979 2004-10-11
  • 打赏
  • 举报
回复
楼上的解释很清楚了,你如何让Confirm去继承Config,Config的构造函数本身是私有的,如何继承?
Confirm类没有办法创建.
zhang21cnboy 2004-10-11
  • 打赏
  • 举报
回复
既然你的Config不能被new,那么你就不能直接继承Config。当你集成了Config的时候,我不知道你的Confirm是如果构造的,所以上述问题就无法回答。
海盗2019 2004-10-11
  • 打赏
  • 举报
回复
Config.java的v 定义去掉了static,

...
public class Config
{
public Vector[] v = new Vector[0];
... ...
}

这样有多个Config的继承就不会有冲突了 ??
海盗2019 2004-10-11
  • 打赏
  • 举报
回复
PeterChen82(软体动物),:")
海盗2019 2004-10-11
  • 打赏
  • 举报
回复
示例代码如下:

Config.java

import java.util.*;

public class Config
{
public static Vector[] v = new Vector[0];

public void load()
{
v = new Vector[2];
v[0] = new Vector();
v[0].add("aa");
v[1] = new Vector();
v[1].add("bb");
}

public void reload()
{
v = new Vector[2];
v[0] = new Vector();
v[0].add("cc");
v[1] = new Vector();
v[1].add("dd");
}
}

Singleton.java

public class Singleton extends Config
{
private static Singleton instance = null;


public static synchronized Singleton getInstance()
{
if (instance==null)
instance = new Singleton();
return instance;
}

public void print()
{
int j = v.length;
for (int i = 0; i < j; i++)
{
System.out.println(v[i]);
}
}

public static void main(String[] args)
{
Singleton ss = Singleton.getInstance();
System.out.println("unload");
ss.print();
ss.load();
System.out.println("s1 load");
ss.print();
Singleton st = Singleton.getInstance();
System.out.println("s2 unload");
st.print();
st.reload();
System.out.println("s2 load");
st.print();
ss.print();
ss=null;
st=null;
System.out.println("s3 unload");
Singleton s3 = Singleton.getInstance();
s3.print();
}
}

java Singleton

unload
s1 load
[aa]
[bb]
s2 unload
[aa]
[bb]
s2 load
[cc]
[dd]
[cc]
[dd]
s3 unload
[cc]
[dd]

这样说明清楚了把??
PeterChen82 2004-10-11
  • 打赏
  • 举报
回复
子类会引用父类的static的v,而不会创建它的拷贝。除非你在子类里再重新定义一个static的v。
海盗2019 2004-10-11
  • 打赏
  • 举报
回复
其实这个v是用来存放大量数据对象用的,希望只reload一次,一个Vector存放某类数据,所有地方公用它,不需要每次都查询数据库;以前是把Confirm设置成静态类,这样Config的方法得很多都要设置成静态方法,扯远了,:")
海盗2019 2004-10-11
  • 打赏
  • 举报
回复
继承的全是public的,刚才偷懒没写,还有构造函数都是有的,sorry。

初始化继承了A类的B类,每次A类的静态属性会不会都有一份copy,或者被初始化??

比如我上面定义的static Vector[] v,第一次new的时候,会给v赋值;以后再new B()的时候,这个v是不是又是null,或者再拷贝一个v?

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧