Java внутренняя загадка видимости класса

Как kronoz сказал в.Net 3.5, который можно использовать Distinct().

В.Net 2 Вы могли подражать ему:

public IEnumerable<T> DedupCollection<T> (IEnumerable<T> input) 
{
    var passedValues = new HashSet<T>();

    // Relatively simple dupe check alg used as example
    foreach(T item in input)
        if(passedValues.Add(item)) // True if item is new
            yield return item;
}

Это могло использоваться для дедупликации любого набора и возвратит значения в первоначальном заказе.

Это обычно намного более быстро для фильтрации набора (как и Distinct() и этот образец делает), чем это должно было бы удалить объекты из него.

10
задан Pete Kirkham 6 July 2009 в 09:53
поделиться

3 ответа

Внутренние классы - это, по сути, взлом, введенный в Java 1.1. JVM фактически не имеет понятия о внутреннем классе, поэтому компилятор вынужден его игнорировать. Компилятор генерирует класс B «вне» класса A, но в том же пакете, а затем добавляет к нему синтетические средства доступа / конструкторы, чтобы позволить A получить к нему доступ.

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

25
ответ дан 3 December 2019 в 15:06
поделиться

Доступ класса B и его конструктор не обязательно должны совпадать. У вас может быть частный внутренний класс с конструктором области пакета, и я обычно это делаю.

public class A {
  public A() { b = new B(); }
  B b;
  private class B {
    B() { }
  }
}
2
ответ дан 3 December 2019 в 15:06
поделиться

Вам необходимо использовать

this.new B();
-1
ответ дан 3 December 2019 в 15:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: