2016-04-05 30 views
0

Nesnenin örneğini döndürmek için kullanılan yönteme sahibim. Yansımayı kullanmak, sınıf örneğini iyi alıyorum. Aynı sınıf için her seferinde yeni bir nesne oluşturmamaya ihtiyacım var. Bir şey mi özlüyorum? İşte Yansıma kullanılarak birden çok nesne oluşturulmasını nasıl önleyebilirim?

private static final ConcurrentMap<String, FutureTask<Object>> INSTANCES = new ConcurrentHashMap<>(); 

private static Object getInstance(String clazz) throws InterruptedException, ExecutionException {//full path of the class in the clazz 
    FutureTask<Object> task = new FutureTask<>(() -> Class.forName(clazz).newInstance()); 
    FutureTask<Object> previous = INSTANCES.putIfAbsent(clazz, task); 
    if (previous == null) { 
     task.run(); 
    } else { 
     task = previous; 
    } 
    return task.get(); 
} 

aynı kod ama Java 1.7 için

private static final ConcurrentMap<String, FutureTask<Object>> INSTANCES = new ConcurrentHashMap<>(); 

private static Object getInstance(final String clazz) throws InterruptedException, ExecutionException {//full path of the class in the clazz 
    FutureTask<Object> task = new FutureTask<>(new Callable<Object>() { 
     @Override 
     public Object call() throws Exception { 
      return Class.forName(clazz).newInstance(); 
     } 
    }); 
    FutureTask<Object> previous = INSTANCES.putIfAbsent(clazz, task); 
    if (previous == null) { 
     task.run(); 
    } else { 
     task = previous; 
    } 
    return task.get(); 
} 
+0

Önbellek olarak bir Harita 'ye ihtiyacınız var gibi geliyor ... –

+0

instanceOf yöntemini kontrol edebilirsiniz. – Gopal00005

+0

... veya IoC kabı kullanın –

cevap

1

Devam nasıl olduğunu singleton olarak dönmek istediğiniz sınıflar. Daha sonra getInstance() yönteminizde, singleton'un getInstance() yöntemini (veya onu ne istiyorsanız) çağırırsınız. Böylece örneğin, sizin tekil sınıf şuna benzer olacaktır:

public class ClassOne { 

    private static ClassOne instance; 

    public static ClassOne getInstance() { 
     if (instance==null) { 
     instance = new ClassOne(); 
     } 
     return instance; 
    } 
} 

Ve getInstance() metodu şuna benzer şekilde modifiye olacaktır. Yeni bir örneğini sınıfına kendisine oluşturulduğunda ait

private static Object getInstance(String clazz) {//full path of the class in the clazz 
    Class<?> c = null; 
    Object obj = null; 
    try { 
     c = Class.forName(clazz); 
     System.out.println("inside ins" + c); 
     Method method = c.getMethod("getInstance", null); 
     obj = method.invoke(null, null); 

    } catch (Exception e) { 
     System.out.println(e); 
    } 
    return obj; 
} 

Yani aslında sadece yetkilendirirken kontrolünü (böylece ilke kesinlikle iş yapar bu kodun test edilmemiştir, ama daha önce tam olarak yapmış unutmayın). Bu şekilde çağırmak istediğiniz sınıflara bağlı olarak, tekil davranışını, miras alabileceğiniz ayrı bir sınıfa soyutlamak mümkün olabilir, ancak bu gibi bir yansımayı kullanırken bu biraz zor olabilir.

+0

oluşturmak yerine bu objeyi iade etmem gerekiyor sanırım JRE 1,8 ile uyguladığımı sanırım JRE 1.7 için bana teklif verebilir misiniz? Sanırım lambda sadece 1.8'den başlıyor. – Rathishkumar

+0

Java 1.7 sürümü eklendi –

+0

Basit bir sorunu çözmek için ne kadar gülünç bir yol. – Kayaman

0

Bir olasılık burada uygulamak olacaktır:

private static Object getInstance(String clazz) 
{ 
    //full path of the class in the clazz 

    Class<?> c = null; 
    Object obj = null; 

    try 
    { 
     c = Class.forName(clazz); 
     System.out.println("inside ins" + c); 
     obj = c.newInstance(); 
    } 
    catch (Exception e) 
    { 
     System.out.println(e); 
    } 
    return obj; 
} 

Object inst = getInstance("com.test.Test1"); 
Method method = inst.getClass().getMethod("getVal", String.class,String.class); 
method.invoke(inst, "new params","ss"); 

sayesinde

İşte
İlgili konular