相关疑难解决方法(0)

793
推荐指数
17
解决办法
30万
查看次数

什么是枚举,为什么它们有用?

今天我正在浏览这个网站上的一些问题,我发现提到了一个enum 单独使用模式的关于这种解决方案所谓的线程安全的好处.

我从来没有使用过enums,而且我已经用Java编程了好几年了.显然他们改变了很多.现在他们甚至在自己内部全力支持OOP.

现在为什么我应该在日常编程中使用枚举?

java enums

464
推荐指数
13
解决办法
28万
查看次数

为什么Enum会实现接口?

我刚刚发现Java允许枚举实现一个接口.什么是一个很好的用例呢?

java enums

180
推荐指数
12
解决办法
15万
查看次数

线程安全单例类

我写了一个下面的Singleton类.我不确定这是否是线程安全的单例类?

public class CassandraAstyanaxConnection {

    private static CassandraAstyanaxConnection _instance;
    private AstyanaxContext<Keyspace> context;
    private Keyspace keyspace;
    private ColumnFamily<String, String> emp_cf;



    public static synchronized CassandraAstyanaxConnection getInstance() {
        if (_instance == null) {
            _instance = new CassandraAstyanaxConnection();
        }
        return _instance;
    }

    /**
     * Creating Cassandra connection using Astyanax client
     *
     */
    private CassandraAstyanaxConnection() {

        context = new AstyanaxContext.Builder()
        .forCluster(ModelConstants.CLUSTER)
        .forKeyspace(ModelConstants.KEYSPACE)
        .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()      
            .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
        )
        .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
            .setPort(9160)
            .setMaxConnsPerHost(1)
            .setSeeds("127.0.0.1:9160")
        )
        .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()      
            .setCqlVersion("3.0.0")
            .setTargetCassandraVersion("1.2"))
        .withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
        .buildKeyspace(ThriftFamilyFactory.getInstance());

        context.start();
        keyspace = context.getEntity();

        emp_cf = …
Run Code Online (Sandbox Code Playgroud)

java singleton multithreading

58
推荐指数
2
解决办法
6万
查看次数

Java中的线程安全单例

关于Singletons的维基百科文章提到了一些在Java中实现结构的线程安全方法.对于我的问题,让我们考虑具有冗长初始化过程并且同时被许多线程所占据的单身人士.

首先,这个未提及的方法是否是线程安全的,如果是这样,它会同步什么?

public class Singleton {
    private Singleton instance;

    private Singleton() {
        //lots of initialization code
    }

    public static synchronized Singleton getInstance() {
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

其次,为什么以下实现线程在初始化时是安全且懒惰的?如果两个线程同时进入该getInstance()方法会发生什么?

public class Singleton {
    private Singleton() {
        //lots of initialization code
    }

    private static class SingletonHolder { 
        public static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,在第二个示例中,如果一个线程首先获取实例而另一个线程获取实例并尝试在构造函数在第一个线程中完成之前对其执行操作,该怎么办?那你可以进入一个不安全的状态吗?

java singleton multithreading synchronization thread-safety

38
推荐指数
1
解决办法
2万
查看次数

数据库连接应该是单例吗?

Java中创建单例的最佳方法是什么?数据库连接应该是单例(单例是否是自动线程安全的)?因为理论上DB不能同时被许多用户访问.

java singleton design-patterns

18
推荐指数
2
解决办法
4万
查看次数

Java Singleton模式

编辑:已回答 - 错误是方法不是静态的

我使用的是Singleton设计模式

 public class Singleton {
   private static final Singleton INSTANCE = new Singleton();

   // Private constructor prevents instantiation from other classes
   private Singleton() {}

   public static Singleton getInstance() {
      return INSTANCE;
   }
 }
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在另一个类中创建类Singleton的对象?

我试过了:

Singleton singleton = new Singleton(); 
// error - constructor is private
Singleton singleton = Singleton.getInstance();
// error - non-static method cannot be referenced from a static context
Run Code Online (Sandbox Code Playgroud)

什么是正确的代码?

谢谢,斯宾塞

java singleton design-patterns initialization

17
推荐指数
1
解决办法
3万
查看次数

如何初始化基于Java枚举的Singleton?

如果我必须在使用该对象之前初始化它,那么初始化基于java enum的单例的正确方法是什么.

我已经开始编写代码,但我不确定我是否做得对.你能帮我实现这个单身对我来说正确吗?

public enum BitCheck {

    INSTANCE;

    private static HashMap<String, String> props = null;

    public synchronized void  initialize(HashMap<String, String> properties) {
        if(props == null) {
            props = properties;
        }
    }

    public boolean isAenabled(){
        return "Y".equalsIgnoreCase(props.get("A_ENABLED"));
    }

    public boolean isBenabled(){
        return "Y".equalsIgnoreCase(props.get("B_ENABLED"));
    }

}
Run Code Online (Sandbox Code Playgroud)

java singleton enums

16
推荐指数
2
解决办法
2万
查看次数

延迟加载的单例:双重检查锁定与初始化按需持有者习惯用法

我需要在并发环境中延迟加载资源.加载资源的代码只能执行一次.

这两个双重检查锁定(使用JRE 5+和volatile关键字)和初始化按需持有者成语似乎适合这个职业.

仅仅通过查看代码,按需初始化持有者习惯看起来更干净,更有效(但是嘿,我猜这里).不过,我必须小心并记录我的每一个单身人士的模式.至少在我看来,很难理解为什么代码会在现场写出来......

我的问题是:哪种方法更好?为什么?如果你的答案是否定的.您将如何在Java SE环境中解决此要求?

备择方案

我可以使用CDI而不强制它在整个项目中使用吗?那里有文章吗?

java concurrency singleton design-patterns lazy-loading

9
推荐指数
4
解决办法
5648
查看次数

Java:枚举常量中方法和变量的定义

我正在做一些实验并且意外地编写了一个代码,这非常奇怪而且我不能完全理解.我甚至感到惊讶,我可以编译它.它看起来像这样:

enum Foo {
    VALUE_1 {
        public int myVariable = 1;
    },
    VALUE_2 {
        public void myMethod() {
            //
        }
    },
    VALUE_3;
}
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,不可能通过以下方式访问这样的元素:

Foo.VALUE_2.myMethod();
Run Code Online (Sandbox Code Playgroud)

原因是,编译器将在枚举本身内查找该方法.

我假设不可能从枚举之外访问这些方法和变量.出于这个原因,我尝试创建一个参数化构造函数并使用一些内部变量调用它:

enum Foo {
    VALUE(internalVariable) {
        int internalVariable = 1;
    };

    private Foo(int param) {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

编译这样的结构是不可能的.现在我在想如果没有办法访问它,在常量中定义一些内容是什么意思.

我试图在常量中创建同名的方法以及枚举本身,以检查它是否以某种方式发生碰撞.它没有!

enum Foo {
    VALUE_1 {
        int myVariable = 1;

        public int myMethod() {
            return myVariable;
        }
    },
    VALUE_2 {
        //
    };

    public int myMethod() {
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是有趣的时刻!我试图在枚举中继续调用myMethod()并实际找出这个Java魔法是如何工作的.方法,在常量内定义,覆盖枚举中定义的方法.

Foo.VALUE_1.myMethod(); // Returns 1 …
Run Code Online (Sandbox Code Playgroud)

java oop inheritance enums language-design

9
推荐指数
1
解决办法
5778
查看次数