gpt4 book ai didi

编程到接口(interface)的Java单例枚举?

转载 作者:行者123 更新时间:2023-11-30 06:54:45 25 4
gpt4 key购买 nike

这是我在这里的第一篇文章,所以我会尽量准确。这是一个大学项目,我们必须在我们单独制作的 OO 架构之上创建一个鱼缸模拟。我正在探索单例的用途并发现它们非常有用,但是在线阅读我目前实现它的方式不是线程安全的。

我目前实现的方式(认为是惰性方法)注意:我们必须通过接口(interface)

public interface myInterface
{
void foo();
}

public class myClass implements myInterface
{
private static myInterface instance;

private myClass(){}

private static myInterface Instance()
{
if(instance == null)
instance = new myClass();

return instance;
}

public void foo()
{
//Do stuff
}

public void bar()
{
//Do More Stuff
}
}

这很好用,但它不是线程安全的我可以将同步关键字添加到 getter,但我读到这对系统来说非常繁重,而且我有很多单例。

private synchronized static myInterface Instance()
{
if(instance == null)
instance = new myClass();

return instance;
}

然后我转向了一个枚举单例,它是线程安全的并且对系统来说并不沉重,但是我不确定如何将它编程到接口(interface)。

public enum myClass implements myInterface
{
INSTANCE;
private myClass(){}

public void foo()
{
//Do stuff
}

public void bar()
{
//Do More Stuff
}
}

在接口(interface)编程中,我的意思是当我调用单例时,我只能访问接口(interface)中的方法(如果我指的是错误的,请纠正我)。这是我完成枚举单例失败的地方。例如:对于惰性单例,我不能调用它,因为它不在界面中:

 myClass.Instance().bar();

但是它可以调用这个,这是正确的,因为它在界面中。

myClass.Instance().foo();

但是我可以使用枚举调用它,而不是对接口(interface)进行编程

myClass.INSTANCE.bar();

我理解为什么它这样做,因为类是一个枚举,所以它将能够调用该枚举类中的所有内容。因此,在我为此道歉的这篇长文章之后,主要问题是:我能否使枚举版本仅调用接口(interface)中声明的方法?

如果它不能在系统上有多大的同步方法,我会有大约 4-6 个?

请注意:尽管这是一个大学项目,但我们只在一个线程上运行模拟,因此它甚至不需要线程安全。我不太了解多线程,但我认为这将是一个很好的学习机会。

最佳答案

如果您更喜欢枚举路由,您也可以随时隐藏您的枚举实现:

public interface Singleton {
void foo();
}

public final class SingletonAccessor {

public static Singleton getInstance() {
return SingletonImpl.INSTANCE;
}

private SingletonAccessor() {
}

private enum SingletonImpl implements Singleton {
INSTANCE;
public void foo() {
// ...
}
public void bar() {
// ...
}
}

}

编辑

正如 Peter Lawrey 在评论中指出的那样,您甚至可以为 SingletonAccessor 使用枚举 :)

public enum SingletonAccessor {

SINGLETON;

public Singleton get() {
return SingletonImpl.INSTANCE;
}

private enum SingletonImpl implements Singleton {
INSTANCE;
public void foo() {
// ...
}
public void bar() {
// ...
}
}

}

关于编程到接口(interface)的Java单例枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36058443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com