2013-03-07 3 views
0

У меня есть следующий класс:метод экземпляра Java

public class Example(

    private String id; 
    private ArrayList<String> docs = new ArrayList(); 

    public Example(string startid){ 
     id = startid; 
     docs = null; 
    } 

    public void myMethod(String externalID){ 

     Example myExample = new Example(externalID); 

} 

Если я хорошо понимаю, когда я называю MyMethod, это создаст экземпляр из примера называется myExample с идентификатором = ExternalId и DOCS = NULL.

То, что я хочу этот класс, чтобы сделать это: Вызова MyMethod одновременно из внешних точек, которые будут создавать экземпляр (myExample) и убедитесь, что внешние вызовы не могут перезаписать любого из переменной myExample в Что я (нить безопасно?) хотите, чтобы это произошло, чтобы заполнить массив docs внешним вызовом в соответствующем экземпляре myExample. Возможно ли это вообще или мне нужно передать ArrayList с помощью startid одновременно?

+0

Что вы делаете с помощью своего 'myExample' var? Разве вы не можете вернуть 'myMethod' его? Таким образом, любая * внешняя точка * будет управлять своим собственным экземпляром по мере необходимости. – sp00m

+0

'myExample' имеет локальную видимость в методе' myMethod', он вообще не отображается для внешнего вызова. Или вы планируете иметь 'myExample' как переменную экземпляра или класса? – A4L

+0

Я не уверен, чего вы хотите достичь, используя 'myMethod', почему бы вам просто не вызвать конструктор для создания нового объекта. Я не вижу никакой пользы в использовании этого метода, и кстати. - как упоминалось выше - созданный объект Example не может использоваться вне метода. – Don

ответ

1

Основываясь на мысли Бенуа, что вы хотите для того чтобы достигнуть, я думаю, что лучший способ использует карту (или ConcurrentMap, если вы хотите резьбовых безопасность):

ConcurrentMap<String, List<String>> myData = new ConcurrentHashMap<>(); 

Таким образом, вы можете обратиться к любому списку по предоставленному вами идентификатору.

List<String> myList = myData.get(id); 

Если вы хотите ограничить аксессоров в списке (например только обеспечивает метод добавления), необходимо инкапсулировать список в классе:

public final class Example { 
    private final List<String> docs = new ArrayList<>(); 

    public boolean addDoc(final String doc) { 
     return docs.add(doc); 
    } 
} 

И затем использовать карту следующим образом:

ConcurrentMap<String, Example> myData = new ConcurrentHashMap<>(); 

И добавить документы, как, что:

myData.get(id).addDoc(myDoc); 

Надеюсь, это поможет ...

По теме обсуждается в комментариях: Настройка переменных

У вас есть класс вроде этого:

public class Example { 
    public String var; 
} 

и экземпляр, как этот

Example ex = new Example(); 

Вы можете установить значение с

ex.var = "abc"; 

С Calss как этого

public class Example { 
    private String var; 
    public void setVar(String var) { 
     this.var = var; 
    } 
} 

использование

ex.setVar("abc"); 

Управления нескольких экземпляров:

1) Веб-служба получить информацию с идентификатором

2) Ваш сервер -application хранит карту экземпляров, и вы можете получить к ней доступ через идентификатор (см. пример карты выше). В веб-службы вы звоните

Example ex = ReportHolder.getReport(id); 

Предполагая, что класс, как это:

public class ReportHolder { 
    private static ConcurrentMap<String, Example> map = new ConcurrentMap<>(); 
    public static Example getReport(final String id) { 
     return map.get(id); 
    } 
} 

3) Затем вы можете манипулировать экземпляр.

Убедитесь, что вы правильно поняли термины variable, class, instance и static. Другое дело, будет сложно понять, почему произошла ваша ошибка.

+0

Я в замешательстве. Я хотел бы достичь: вызвать файл jar через HTTP-вызов и передать переменные, например ID и документы. Каждый новый входящий вызов webservice будет порождать новый экземпляр класса. – L4zl0w

+0

Я не знал, что мы говорим о веб-сервисах. Запрос веб-сервиса обрабатывается одним потоком нормально, поэтому разные запросы обрабатываются разными потоками. Это означает, что вы всегда создавали новый объект Example, вызывая веб-сервис. Какую структуру вы используете (как вы реализовали веб-сервис)? Вопрос в том, что вы хотите сделать с объектом Example после его создания? – Don

+0

Я запускаю свой код в стороннем приложении BI Publisher. Когда отчет выполняется через вызов веб-службы, отчет запускает приложение java. В настоящий момент приложение работает, когда один сеанс веб-службы приходит одновременно, но когда несколько одновременно, статические переменные перезаписываются, следовательно, генерируется неправильный вывод. Таким образом, вызов веб-службы вызывает отчет, затем отчет вызывает класс Java и передает различные атрибуты с использованием статических методов настройки. Как-то мне нужно убедиться, что при запуске 2 отчетов переменные не смешиваются. – L4zl0w

1

Вы понимаете неправильно.

Для того, чтобы позвонить myMethod, необходимо, чтобы экземпляр примера уже был создан, а вызов myMethod будет создавать экземпляр нового экземпляра с внешним идентификатором, и сразу же его отбросить.

Из того, что я понимаю, что вы хотите следующее:

public class Example { 

    // Final so it can't be modified once set. 
    private final String id; 

    // Final so it can't be switch to a different list. 
    // Public so others can add to it and have acces to List methods. 
    // Synchronized so acces to it from multiple threads is possible. 
    // Note: You should probably make this private and have a getList() method that 
    //  returns this instance to have nice encapsulation. 
    public final List<String> docs = Collections.synchronizedList(new ArrayList()); 

    // Make default constructor private to force setting the startId. 
    private Example() {} 

    public Example(final String startId){ 
    this.id = startId; 
    } 
} 
+0

Спасибо Бенуа. Будет ли каждый экземпляр класса иметь собственный список? Можно ли указать конкретный экземпляр для добавления в список? например основанный на id? – L4zl0w

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