我知道Java枚举被编译为具有私有构造函数和一堆公共静态成员的类.当比较给定枚举的两个成员时,我总是使用.equals(),例如
public useEnums(SomeEnum a)
{
if(a.equals(SomeEnum.SOME_ENUM_VALUE))
{
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
但是,我刚刚遇到一些使用equals运算符==而不是.equals()的代码:
public useEnums2(SomeEnum a)
{
if(a == SomeEnum.SOME_ENUM_VALUE)
{
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
我应该使用哪个运营商?
荣耀的全球变量 - 成为一个荣耀的全球阶级.有人说打破面向对象的设计.
给我一些场景,除了好的旧记录器,使用单例是有意义的.
任何人都可以通过一个例子告诉我同步方法优于synchronized块的优势吗?
编辑:从另一个问题我提供了一个答案,链接到很多关于单身人士的问题/答案:有关单身人士的更多信息:
所以我读过Singletons的帖子:好的设计还是拐杖?
争论仍然激烈.
我认为单身人士是一种设计模式(好的和坏的).
Singleton的问题不是模式而是用户(对不起所有人).每个人和他们的父亲都认为他们可以正确地实施一个(而且从我做过的许多采访中,大多数人都做不到).此外,因为每个人都认为他们可以实现正确的Singleton,他们滥用模式并在不合适的情况下使用它(用Singletons替换全局变量!).
所以需要回答的主要问题是:
我对这篇文章的希望是,我们可以在一个地方收集(而不是谷歌和搜索多个网站)一个权威的来源,了解何时(以及如何)正确使用单身人士.同样合适的还有一份反用法和常见的不良实施清单,解释了为什么他们无法工作以及为了实现他们的弱点.
所以让球滚动:
我会举起手来说这是我用的,但可能有问题.
我喜欢"Scott Myers"在他的书"Effective C++"中处理这个主题
使用单身人士的好情况(不是很多):
- 记录框架
- 线程回收池
/*
* C++ Singleton
* Limitation: Single Threaded Design
* See: http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
* For problems associated with locking in multi threaded applications
*
* Limitation:
* If you use this Singleton (A) within a destructor of another Singleton (B)
* This Singleton (A) must be fully constructed before the constructor of (B)
* is called.
*/
class MySingleton
{ …Run Code Online (Sandbox Code Playgroud) 我们有一个类,用于保存应用程序的配置信息.它曾经是一个单身人士.经过一些建筑评论后,我们被告知要删除单身人士.我们确实看到了在单元测试中不使用单例的一些好处,因为我们可以同时测试不同的配置.
如果没有单例,我们必须在代码中的任何地方传递实例.它变得如此混乱,所以我们编写了一个单独的包装器.现在我们将相同的代码移植到PHP和.NET,我想知道是否有更好的模式我们可以用于配置对象.
基于SO问题编写的最佳单例实现在Java中 - 即使用枚举创建单例 - 有什么区别/优点/缺点(构造函数省略)
public enum Elvis {
INSTANCE;
private int age;
public int getAge() {
return age;
}
}
Run Code Online (Sandbox Code Playgroud)
然后打电话 Elvis.INSTANCE.getAge()
和
public enum Elvis {
INSTANCE;
private int age;
public static int getAge() {
return INSTANCE.age;
}
}
Run Code Online (Sandbox Code Playgroud)
然后打电话 Elvis.getAge()
单身人士是一个备受争议的设计模式,所以我对Stack Overflow社区对它们的看法感兴趣.
请提供您的意见的原因,而不仅仅是"单身人士是懒惰的程序员!"
这是一篇关于这个问题的相当不错的文章,虽然它反对使用Singletons: scientificninja.com:performant-singletons.
有没有人对他们有任何其他好文章?也许是为了支持单身人士?
这无疑是一个相当宽松的问题.我目前对单身人士的理解是,他们是一个你设置的类,只有一个实例被创建.
这对我来说听起来很像静态类.主要区别在于,对于静态类,您不能/不能实例化它,您只需使用它Math.pi().使用单例类,你仍然需要做类似的事情
singleton firstSingleton = new singleton();
firstSingleton.set_name("foo");
singleton secondSingleton = new singleton();
Run Code Online (Sandbox Code Playgroud)
如果我错了,请纠正我,但firstSingleton == secondSingleton现在,是吗?
secondSingleston.set_name("bar");
firstSingleton.report_name(); // will output "bar" won't it?
Run Code Online (Sandbox Code Playgroud)
请注意,我独立询问这种语言,更多关于这个概念.所以我并不担心实际上如何编写这样一个类,但更多的是为什么你不愿意和你需要考虑什么.
我知道Java中的双重锁定已被破坏,那么在Java中使单例线程安全的最佳方法是什么?我想到的第一件事是:
class Singleton{
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance == null) instance = new Singleton();
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
这有用吗?如果是这样,它是最好的方式(我想这取决于具体情况,所以说明特定技术最好的时候会有用)