Создать класс Singleton с общей переменной экземпляра? - PullRequest
0 голосов
/ 16 января 2019

У меня есть сценарий, где есть компонент с объектом будущего (класс А ниже). У меня есть другой класс (класс B ниже), который является одиночным и имеет HashMap в качестве переменной экземпляра типа и реализует интерфейс (TestInterface ниже), который снова реализует Callable.

Согласно текущему сценарию, пользователь может передать только Future типа Object, но в соответствии с моими новыми требованиями я хочу Future Object of Generic Type. Я изменил код, который, кажется, работает, но есть много предупреждений, и я не уверен, верны ли мои изменения. Есть несколько сценариев, для которых я уверен, что код потерпит неудачу. Основная проблема, с которой я сталкиваюсь, заключается в инициализации HashMap GenericType в пределах одноэлементного класса. Кто-нибудь может мне помочь с этим?

Приведенный ниже код является примером существующего кода.

Интерфейс тестирования интерфейса:

interface TestInterface extends Callable<Void>{
    void doSomething(Future<Object> future, String id); 
}

Класс A

class A{
 private Future<Object> future;
 private CustomInteraface a;

 public A(Future<Object> future, CustomInteraface a){
    //do init
 }
 //getters and setters
}

Класс B

Class B implements TestInterface{

    private HashMap<String, A> map = new HashMap();
    private static B monitor = new B();


    public Void call(){
        HashMap.Entry<String, A> pair = (HashMap.Entry<String, A>) it.next();
        A a = (A) pair.getValue();
        Future<Object> future = a.getFuture();
        // Do something
    }

    public void doSomething(Future<Object> future, String id){
        if(map.contains(id)){
            //Do something
        }
        else{
            A a = new A(future, null);
            map.put();
        }
    }

}

Изменения, внесенные в Genrics

Интерфейс тестирования интерфейса:

interface TestInterface extends Callable<Void>{
    <T> void doSomething(Future<T> future, String id);  
}

Класс A

class A<T>{
 private Future<T> future;
 private CustomInteraface a;

 public A(Future<T> future, CustomInteraface a){
    //do init
 }
 //getters and setters
}

Класс B

Class B implements TestInterface{

    private HashMap<String, A> map = new HashMap();
    private static B monitor = new B();


    public Void call(){
        HashMap.Entry<String, A> pair = (HashMap.Entry<String, A>) it.next();
        A a = (A) pair.getValue();
        //Code will definitely fail here as I'm trying to cast a future object of generic type to Object class
        Future<Object> future = a.getFuture();
        // Do something
    }

    public void doSomething(Future<T> future, String id){
        if(map.contains(id)){
            //Do something
        }
        else{
            A<T> a = new A<T>(future, null);
            map.put();
        }
    }

}

1 Ответ

0 голосов
/ 17 января 2019

Если вы потенциально вводите в карту A<T> разнородных типов, карту необходимо объявить как подстановочный знак:

private HashMap<String, A<?>> map = new HashMap();

Затем вы получите значение из карты, таким образом:

    // The cast was only necessary because A by itself is a raw type.
    HashMap.Entry<String, A<?>> pair = it.next();
    A<?> a = pair.getValue();
    Future<?> future = a.getFuture();
    // Note that future.get() yields an Object

И поместите его в карту, например:

public void doSomething(Future<?> future, String id){
    ...
        A<?> a = new A<>(future, null);
        map.put(id, future);
    ...
}

Если вам нужен T возвращаемый тип будущего в doSomething, вы можете объявить переменную типапо методу:

public <T> void doSomething(Future<T> future, String id){
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...