Статический метод вызывает проблему - PullRequest
2 голосов
/ 30 августа 2010

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

public static void writeArticle(TypeA typeA, TypeB typeB) {
  AWriter writer =  AFactory.getWriter("aWriter");
  Article article = writer.newArticle();

  /* PARAMETER WRITE START */

  article.set("title", typeA.getTitle());
  article.set("author", typeB.getName());
  article.set("age", typeB.getAge());
  // …
  /* more set statments here */
  writer.write(article);
}

Может ли этот метод вызвать проблему, когда писатель напишет статью со смешанным значением?То есть, когда 2 экземпляра класса (Class A и ClassB), вызывающие этот метод, Article получит некоторые значения typeA из ClassA, а некоторые из ClassB?

Ответы [ 7 ]

5 голосов
/ 30 августа 2010

Нет. Как вы думаете, почему аргументы от двух разных вызовов смешались? Нет причин думать, что они будут.

Если это многопоточная программа, вы должны быть осторожны с разделением объектов между потоками; если эти объекты имеют изменяемое состояние (переменные-члены, которые могут быть изменены), вам следует позаботиться о том, чтобы два потока не изменяли состояние одновременно.

4 голосов
/ 30 августа 2010

Всякий раз, когда вы говорите static, вы не говорите о вызовах методов экземпляра.Всегда статические методы должны вызываться с именем класса.

Статический метод полностью изолирован на уровне экземпляра.Даже если он может написать смешанное значение, это то, что вы хотите написать, не так ли?

3 голосов
/ 30 августа 2010

Нет, параметры метода и локальные переменные являются поточно-ориентированными , если они не ссылаются на общие объекты .

0 голосов
/ 30 августа 2010

Это непонятно из этого фрагмента кода.Первый вопрос, который необходимо решить, заключается в том, может ли этот метод вызываться из двух разных потоков одновременно.Если это так, то, скорее всего, проблема заключается в том, что два потока изменяют один и тот же объект одновременно (статья или писатель).Самый простой способ решить эту проблему - синхронизировать writeArticle ().

0 голосов
/ 30 августа 2010

Это было бы невозможно для вашего кода. typeA имеет метод getTitle, а typeB имеет метод getName. Какие поля перепутаны?

0 голосов
/ 30 августа 2010

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

0 голосов
/ 30 августа 2010

Нет. В противном случае это был бы ад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...