Это подразумевается для основных конструкторов без параметров, но это необходимо для значений по умолчанию в текущем классе:
public class BaseClass {
protected string X;
public BaseClass() {
this.X = "Foo";
}
}
public class MyClass : BaseClass
{
public MyClass()
// no ref to base needed
{
// initialise stuff
this.X = "bar";
}
public MyClass(int param1, string param2)
:this() // This is needed to hit the parameterless ..ctor
{
// this.X will be "bar"
}
public MyClass(string param1, int param2)
// :base() // can be implied
{
// this.X will be "foo"
}
}
Итерация по коллекциям в Java не является потокобезопасной, даже если вы используете одну из синхронизированных оболочек ( Collections.synchronizedMap (...)
):
Крайне важно, чтобы пользователь вручную синхронизировал возвращенные map при итерации по любому из представлений своей коллекции:
Map m = Collections.synchronizedMap (new HashMap ()); ... Установите s = m.keySet (); // Не обязательно быть в синхронизированном блоке ... synchronized (m) {// Синхронизация по m, а не s! Итератор i = s.iterator (); // Должен быть в синхронизированном блоке в то время как (i.hasNext ()) foo (i.next ()); }
Документы Java Collection Framework
Другие вызовы синхронизированных коллекций безопасны, поскольку классы-оболочки окружают их синхронизированными
блоками, которые используют коллекцию-оболочку в качестве своего монитора:
public int size() {
synchronized( this ) {
return collection.size();
}
}
с collection
является исходной коллекцией. Это работает для всех методов, предоставляемых коллекцией / картой, за исключением материала итерации.
Набор ключей карты синхронизируется точно так же: синхронизированная оболочка вообще не возвращает исходный набор ключей. Вместо этого он возвращает специальную синхронизированную оболочку исходного набора ключей коллекции. То же самое относится к набору записей и набору значений.