2014-02-03 2 views
0

У меня возникли проблемы с методом getInstance, каким-либо образом я пытаюсь я получаю:Создать статический завод в java?

Cannot make a static reference to the non-static type T.

Как я мог бы сделать эту работу? Любой обзор кода также будет полезен. Я проверил несколько связанных должностей, но это кажется странным случаем.

Мой код:

public class Data<Template> 
{ 
    private Template[] data; 
    private int id; 

    public Data(Template[] data) 
    { 
     this.data = data; 
     id = Arrays.hashCode(data); 
     log(); 
    } 

    public Template[] getData() 
    { 
     return data; 
    } 

    public Integer getId() 
    { 
     return id; 
    } 

    private void log() 
    { 
     System.out.println(this.toString()); 
    } 

    @Override 
    public String toString() 
    { 
     StringBuilder tString = new StringBuilder(); 
     tString.append(id + ":"); 
     for (int i = 0; i < data.length; i++) 
     { 
      tString.append(data[i] + " "); 
     } 
     return tString.toString(); 
    } 
} 

public class Store<T> 
{ 
    private Queue<Data<T>> queue; 
    private ConcurrentHashMap<Integer, Data<T>> inProgress; 
    private List<T> results; 
    private static Store instance = null; 

    private Store() 
    { 
     queue = new ConcurrentLinkedQueue<Data<T>>(); 
     inProgress = new ConcurrentHashMap<Integer, Data<T>>(16, 0.9f, 1); 
     results = new ArrayList<>(); 
    } 

    public void addToStore(Data<T> elment) 
    { 
     queue.offer(elment); 
    } 

    public Data<T> getNextTask() 
    { 
     Data<T> element = queue.poll(); 
     inProgress.put(element.getId(), element); 
     return element; 
    } 

    public void taskFinishedSuccessfully(Integer id, T result) 
    { 
     inProgress.remove(id); 
     results.add(result); 
    } 

    public List<T> getResults() 
    { 
     return results; 
    } 

    public static Store getInstance(Class<T> type) 
    { 
     if (instance == null) 
     { 
      if (type instanceof Integer) 
      { 
       instance = new Store<Integer>(); 
      } 

      if (type instanceof Float) 
      { 
       instance = new Store<Float>(); 
      } 

      if (type instanceof Double) 
      { 
       instance = new Store<Double>(); 
      } 
     } 
     return instance; 
    } 
} 
+1

неясно, что вы пытаетесь сделать здесь, или, как это могло бы работать правильно/сделать что-нибудь полезное. –

+0

@BrianRoach Ну, идеей будет то, что вы читаете в большом файле csv, каждая строка - это задача (массив числа), эти задачи помещаются в очередь, когда кто-то начинает обрабатывать эту задачу, потому что в процессе, но в в то время как другие люди могли также получить задачи очереди. –

+0

Я имел в виду то, что похоже на попытку сделать одноэлементный бит, который может каким-то образом изменить типы. Как вы думаете, что вызов 'getInstance (Integer.class)' будет работать, если вы уже создали и пытаетесь вернуть 'Store '? –

ответ

5

Это не понятно, почему вы не просто писать

public static <T> Store<T> getInstance() { 
    return new Store<T>(); 
} 
+0

Извините за мое невежество, но я просто не знаю, если бы я написал его так, как бы я дал параметр типа? Как Store s = Store.getInstance()? –

+1

Я * думаю * ОП пытается сделать его синглом. Это единственное, что я могу придумать. –

+0

И да, оригинальная идее была бы, чтобы сделать ее singleton –

1

Так это то, что я в конечном итоге делает:

public class Store<T> { 
private Queue<Data<T>> queue; 
private ConcurrentHashMap<Integer, Data<T>> inProgress; 
private List<T> results; 
private static Store<Double> doubleInstance = null; 
private static Store<Integer> integerInstance = null; 
private static Store<Float> floatInstance = null; 

private Store() { 
    queue = new ConcurrentLinkedQueue<Data<T>>(); 
    inProgress = new ConcurrentHashMap<Integer, Data<T>>(16, 0.9f, 1); 
    results = new ArrayList<>(); 
} 

public void addToStore(Data<T> elment) { 
    queue.offer(elment); 
} 

public Data<T> getNextTask() { 
    Data<T> element = queue.poll(); 
    inProgress.put(element.getId(), element); 
    return element; 
} 

public void taskFinishedSuccessfully(Integer id, T result) { 
    inProgress.remove(id); 
    results.add(result); 
} 

public List<T> getResults() { 
    return results; 
} 

private static <T> Store<T> getInstance() { 
    return new Store<T>(); 
} 

public static Store<Double> getDoubleInstance() { 
    if (doubleInstance == null) { 

     doubleInstance = Store.<Double> getInstance(); 
    } 
    return doubleInstance; 
} 

public static Store<Integer> getIntegerInstance() { 
    if (integerInstance == null) { 

     integerInstance = Store.<Integer> getInstance(); 
    } 
    return integerInstance; 
} 

public static Store<Float> getFloatInstance() { 
    if (floatInstance == null) { 

     floatInstance = Store.<Float> getInstance(); 
    } 
    return floatInstance; 
} 

}

Смежные вопросы