单身java,关于java:正确的单身设计?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:

Efficient way to implement singleton pattern in Java

我有一个单例类,它作为我的应用程序的状态保护程序。例如,如果我有一个视图有一些数据,我只需将数据打包到一个保存的状态可序列化对象中,然后将其传递给我的singleton,以便稍后进行检索。这一切看起来都很自然和恰当,但我已经偏离了wiki上的单例。在拥有一个get-instance方法的集成中,该方法允许我检索实例并通过实例调用方法,相反,我只是将每个方法都设置为static并静态地使用类。

这是不好的形式吗?有表演损失吗?

谢谢你给我小费~aedon

例如,它在这里

是的,它被认为是不好的形式。

Java中的静态类有许多问题使得它们难以使用。例如,您不能实现接口。此外,如果您需要使它再次成为常规的单例(或者需要使它成为非单例,这种情况经常发生),则必须重写与之交互的每一行代码。

我认为根据经验,更改为非单例将需要重构每一行,因为访问单例最常见的方法是mysingleton.getInstance().someMethod()。不是我对其他问题有异议,只是那个特定的问题。

如果静态使用满足您的需求,我看不出其中有什么坏处。

唯一的缺点是灵活性稍差。如果将其设计为实际的单例,那么可以有一个用于管理状态的接口,并为特定情况实例化特定的实现。然后可以将此对象作为参数传递到应用程序中。

使用一个严格的静态类,没有要传递的对象,因此您必须使用传递类对象并通过该接口访问函数。

当然,所有这些只有在有任何可能扩展到当前类的合理能力之外时才重要。

嗯,很有趣。谢谢您。我使用静态模式的原因之一是为了方便访问(这是一种说懒惰设计的奇特方式)。如果我更深入地研究一个应用程序,并且我意识到访问一些数据有点麻烦,那么我发现只使用全静态类会更容易。

嗯,让它成为一个单例应该只需要在每次使用中添加一行代码。也就是说,不是"foo=single.getfoo();"而是"single=single.getIntance();foo=single.getfoo();"。如果您只需要单例中的一个字段,它只会使一行稍长一些,比如"foo=single.getInstance().getfoo();",这对于长期灵活性来说似乎是一个相当小的代价。

是的,只使用静态方法和变量不是面向对象的方法。单身通常被认为是一种坏习惯。不过,我承认有时候它们很有用。下面是一个简单的例子,说明如何创建一个有效的、功能性强的单例类。注意还有其他的方法,但这是最常见的方法之一…

public class Singleton {

private static final Singleton uniqueInstance;

public static synchronized Singleton getInstance() {

if (Singleton.uniqueInstance == null) {

Singleton.uniqueInstance = new Singleton();

}

return Singleton.uniqueInstance;

}

//other methods go here...

@Override

protected Singleton clone() throws CloneNotSupportedException() {

throw new CloneNotSupporedException("cloning of singleton is not supported");

}

//hide constructor for others to see

private Singleton() {

}

}

喝彩,P

多余的代码发布…

谢谢,但我知道辛格尔顿是如何做到的,我只是好奇静态的做事方式是否不那么有效。

如果@aedonetila不确定如何编写一个singleton,并且只使用静态方法,那么这又有什么必要呢?

@伊多内特拉好吧-我不是从你的问题中得到的…)欢呼

添加到@boris'注释中,如果您只需要一个实用程序类,那么使用枚举更简单

public enum Utility {

; // no instances

public static Object myStaticMethod(Object ... args) { }

}

如果您有一个要实现的接口,那么这一个单例就有意义了。注意,可以使用枚举创建多个单例

public enum Callables implements Callable {

HELLO {

public String call() { return"Hello"; }

},

WORLD {

public String call() { return"World"; }

}

}

注意:Hello和World共享一个超类可调用文件,但实际上有不同的类。

它被认为是不好的形式,因为它不是面向对象的样式。很多人认为单身汉的身体状况很差。坦率地说,这对你想做的事情是很好的。除非你要把这个呈交审查或评估,否则我就不提了。

作为静态类,性能可能会更好。

就我个人而言,我从来没有被"它是坏的,因为它不是面向对象的"的论点所说服过。我的反应是,"那又怎样?"每当某件事的理由是,"因为所有的专家都这么说"或"因为教科书就是这么说的",我就把它理解为"我真的不知道为什么"。

使用枚举而不是singleton。这是最安全的方法。

你能不能更一般一点?你的措词都错了。

@小兔子-同意。@鲍里斯-我不完全确定我会遵守。

@Edonetlira,@boris想说的是,enum单例模式是首选的单例实现。

-1这可能是真的,但这是一个评论(关于一个副本),而不是一个新的答案。

@小兔子,我明白了。谢谢你的澄清。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值