我有一个独立的单身人士,成功通过了测试.但是通过一组测试,这会失败,因为一旦定义了单例,它就不允许重置实例.
关于如何解决这个问题的任何想法?
这是我的示例抽象单例类:
public abstract class A {
protected static A instance;
public static A getInstance() {
return instance;
}
//...rest of my abstract methods...
}
Run Code Online (Sandbox Code Playgroud)
以下是具体实施:
public class B extends A {
private B() { }
static {
instance = new B();
}
//...implementations of my abstract methods...
}
Run Code Online (Sandbox Code Playgroud)
不幸的是我无法在B类中获取静态代码来执行,因此实例变量永远不会被设置.我试过这个:
Class c = B.class;
A.getInstance() - returns null;
Run Code Online (Sandbox Code Playgroud)
还有这个
ClassLoader.getSystemClassLoader().loadClass("B");
A.getInstance() - return null;
Run Code Online (Sandbox Code Playgroud)
在eclipse调试器中运行这两个,静态代码永远不会被执行.我可以找到执行静态代码的唯一方法是将B的构造函数的可访问性更改为public,并调用它.
我在Ubuntu 32bit上使用sun-java6-jre来运行这些测试.
关于使用枚举创建单例类,我在stackoverflow上阅读了很多内容.我一定错过了什么,因为我无法到达任何地方的实习.
这是我的代码:
public class UserActivity {
private DataSource _dataSource;
private JdbcTemplate _jdbcTemplate;
static enum Singleton {
INSTANCE;
private static final UserActivity singleton = new UserActivity();
public UserActivity getSingleton() {
return singleton;
}
}
public UserActivity() {
this._dataSource = MysqlDb.getInstance().getDataSource();
this._jdbcTemplate = new JdbcTemplate(this._dataSource);
}
public void dostuff() {
...
}
}
Run Code Online (Sandbox Code Playgroud)
在外面我想做
UserActivity.INSTANCE.getSingleton()
Run Code Online (Sandbox Code Playgroud)
要么
UserActivity.Singleton.
Run Code Online (Sandbox Code Playgroud)
但是eclipse的代码完成没有找到任何东西
谢谢!
我想创建一个静态类或单例类,它接受在其构造函数中对另一个对象的引用.静态类已经出来了,但我想我可以创建一个在其构造函数中接受参数的单例.到目前为止,我没有任何运气搞清楚或谷歌搜索语法.这可能吗?如果是的话,我该怎么做?
对不起,在最初的帖子中没有任何例子,我匆匆写了.我觉得我的回答已经在回复中了,但这里有一些关于我想做的事情的澄清:
我想创建一个特定类型的单个实例(表示Singleton),但该类型的单个实例需要保存对不同对象的引用.
例如,我可能想要创建一个Singleton"Status"类,它拥有一个StringBuilder对象和一个Draw()方法,可以调用该方法将所述StringBuilder写入屏幕.Draw()方法需要知道我的GraphcisDevice才能绘制.所以我想这样做:
public class Status
{
private static Status _instance;
private StringBuilder _messages;
private GraphicsDevice _gDevice;
private Status(string message, GraphicsDevice device)
{
_messages.Append(message);
_gDevice = device;
}
// The following isn't thread-safe
// This constructor part is what I'm trying to figure out
public static Status Instance // (GraphicsDevice device)
{
get
{
if (_instance == null)
{
_instance = new Status("Test Message!", device);
}
return _instance;
}
}
public void UpdateMessage
...
public void Draw()
{
// …Run Code Online (Sandbox Code Playgroud) 我知道这在社区的各个地方都被讨论了很多次,但我在Delphi中找不到一个简单的单例模式实现.我在C#中有一个例子:
public sealed class Singleton {
// Private Constructor
Singleton( ) { }
// Private object instantiated with private constructor
static readonly Singleton instance = new Singleton( );
// Public static property to get the object
public static Singleton UniqueInstance {
get { return instance;}
}
Run Code Online (Sandbox Code Playgroud)
我知道在Delphi中没有像这样优雅的解决方案,我看到很多关于无法在Delphi中正确隐藏构造函数的讨论(使其成为私有),因此我们需要覆盖NewInstance和FreeInstrance方法.我相信这是我在http://ibeblog.com/?p=65上找到的实现:
type
TTestClass = class
private
class var FInstance: TTestClass;
public
class function GetInstance: TTestClass;
class destructor DestroyClass;
end;
{ TTestClass }
class destructor TTestClass.DestroyClass;
begin
if Assigned(FInstance) then
FInstance.Free;
end;
class …Run Code Online (Sandbox Code Playgroud) 在多线程环境中使用Singleton类的首选方法是什么?
假设我有3个线程,并且所有线程都试图同时访问getInstance()singleton类的方法 -
synchronized getInstance()方法或使用synchronized块是好的做法getInstance().请告知是否还有其他方法.
在一次采访中询问了这个问题.第一部分是编写单例类:
class Singleton
{
static Singleton *singletonInstance;
Singleton() {}
public:
static Singleton* getSingletonInstance()
{
if(singletonInstance == null)
{
singletonInstance = new Singleton();
}
return singletonInstance;
}
};
Run Code Online (Sandbox Code Playgroud)
然后我被问到如何getSingletonInstance()在多线程情况下处理这个问题.我不太确定,但我修改为:
class Singleton
{
static Singleton *singletonInstance;
Singleton() {}
static mutex m_;
public:
static Singleton* getSingletonInstance()
{
m_pend();
if(singletonInstance == null)
{
singletonInstance = new Singleton();
}
return singletonInstance;
}
static void releaseSingleton()
{
m_post();
}
};
Run Code Online (Sandbox Code Playgroud)
然后有人告诉我,虽然需要一个互斥锁,但挂起和发布互斥锁效率不高,因为需要时间.并且有一种更好的方法来应对这种情况.
有没有人知道在多线程情况下处理单例类的更好,更有效的方法?
我正在学习Spring框架,目前正在阅读一本关于它的书.在本书中,它说Spring单例与Java单例不同?这意味着什么,有什么区别?谢谢
我不明白如何实现模式的Enum版本Singleton.下面是使用Singleton模式实现"传统"方法的示例.我想将其更改为使用Enum版本,但我不确定如何.
public class WirelessSensorFactory implements ISensorFactory{
private static WirelessSensorFactory wirelessSensorFactory;
//Private Const
private WirelessSensorFactory(){
System.out.println("WIRELESS SENSOR FACTORY");
}
public static WirelessSensorFactory getWirelessFactory(){
if(wirelessSensorFactory==null){
wirelessSensorFactory= new WirelessSensorFactory();
}
return wirelessSensorFactory;
}
}
Run Code Online (Sandbox Code Playgroud) 我相信吉米尼尔森说他一般都是自己的网络服务单身人士.这是首选方法,还是使用WCF?除了使服务方法保持静态之外,还有什么要做的吗?
singleton ×10
java ×5
enums ×2
c# ×1
c++ ×1
classloader ×1
constructor ×1
delphi ×1
inheritance ×1
junit ×1
mutex ×1
spring ×1
wcf ×1