基于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()
我正在思考编写单例类的其他方法.那么这个类被认为是一个单例类吗?
public class MyClass{
static Myclass myclass;
static { myclass = new MyClass();}
private MyClass(){}
public static MyClass getInstance()
{
return myclass;
}
}
Run Code Online (Sandbox Code Playgroud)
因为静态块只运行一次.
考虑以下代码:
public interface Foo extends Comparable<Foo> {}
public enum FooImpl implements Foo {}
Run Code Online (Sandbox Code Playgroud)
由于类型擦除的限制,我收到以下错误:
java.lang.Comparable不能用不同的参数继承:
<Foo>和<FooImpl>
我有以下要求:
FooImpl 需要是一个枚举,因为我需要将它用作注释中的默认值.我已经尝试在接口中使用泛型边界,但Java不支持.
Eclipse indigo,java 1.6
public interface I {
String getName();
}
/* and in another file */
public enum E implements I {
E1() {
String getName() { return "foo"; }
};
}
Run Code Online (Sandbox Code Playgroud)
在Eclipse中,这有效!其他类可以在类型I的引用上调用getName().实际的javac拒绝它,声称枚举中没有getName()这样的东西.这只是一个Eclipse bug吗?
请注意,对此有用的是枚举器中的方法定义.如果我做正常的事情,它在Eclipse和Javac中都可以正常工作,并且在枚举的底部定义了返回字段值的函数.
现在,我有一个现有的类,我想将其重构为一个Enum。该类当前扩展了另一个类,该类来自外部库。我仍然想从扩展类的某些逻辑中受益,同时希望进行重构。应该怎么做?
在Java中,一个enum类不能扩展另一个类,而可以实现interface。或将其重构为枚举的想法已经是错误的吗?让我在下面的示例代码中展示它。
假设一个现有的类Existing正在扩展另一个类Parent,并且Parent类来自外部库,它不是接口。
class Existing extends Parent{
public static final Existing A = new Existing(...);
....
public static final Existing Z = new Existing(...);
public Existing(Srting attr1, String attr1){
super(attr1, attr2);
}
public Existing(String attr1){
super(attr1);
}
}
Run Code Online (Sandbox Code Playgroud)
这个想法是让那些静态的final字段成为Enums,例如:
enum NewDesign{
A(attr1, attr2),
B(attr1),
C(attr1, attr2)
//...;
//constructor etc.
//...
}
Run Code Online (Sandbox Code Playgroud)
并可能在需要时添加新的额外属性,如下所示:
enum NewDesign{
A(attr1, attr2, newAttr),
B(attr1, newAttr),
C(attr1, attr2, newAttr),
//...
//constructor etc.
//...
}
Run Code Online (Sandbox Code Playgroud) 考虑到我有Algorithm枚举
public enum Algorithm {
SHA1("sha1"),
HMAC("hmac"),;
Algorithm(final String algorithm) {
this.algorithm = algorithm;
}
private final String algorithm;
public String getAlgorithm() {
return algorithm;
}
}
Run Code Online (Sandbox Code Playgroud)
我有不同的算法
public class Sha1 {
public static String hash(final String text, final byte[] sb) {...}
}
Run Code Online (Sandbox Code Playgroud)
和
public class Hmac {
public static String hash(final String text, final byte[] sb) {...}
}
Run Code Online (Sandbox Code Playgroud)
当有人打电话时,我想返回他们的实例
Algorithm.SHA1.getInstance()
Run Code Online (Sandbox Code Playgroud)
题
我想知道是否可以将两个比较器组合成一个比较器,用于两个完全不同的类.对象将按字母顺序排序,字符串类型name属性存在于两个类中,这就是我创建单个比较器的原因.
/**
* Comparator to sort Book or Magazine alphabetically based on
* their String type name property.
*/
public class BookOrMagazineComparator implements Comparator<Object> {
@Override
public int compare(Object o1, Object o2) {
if (o1 != null && o2 != null) {
if (o1 instanceof Book && o2 instanceof Book) {
Book b1 = (Book) o1;
Book b2 = (Book) o2;
return b1.getName().compareTo(b2.getName());
} else if (o1 instanceof Magazine && o2 instanceof Magazine) {
Magazine m1 = (Magazine) …Run Code Online (Sandbox Code Playgroud) 我有一个接口,它是和枚举Commodity的超类型。另外,还有一个具有多个构造函数的类:ItemConsumableOption
class Option{
Option(Item c,int price){. . .}
Option(Consumable c,int price){. . .}
Option(Commodity c,int price){
this(c.getClass()!=Commodity.class?c.getClass().cast(c):Item.EMPTY,price);
}
}
}
Run Code Online (Sandbox Code Playgroud)
编译器认为这将导致无限递归,但显然不会。
Recursive constructor invocation Option(Commodity, int)
如何对他说“闭嘴,伙计,我知道我在做什么!”?
java ×9
enums ×5
interface ×2
singleton ×2
abstract ×1
class ×1
comparable ×1
eclipse ×1
generics ×1
inheritance ×1