Код с фигурными скобками в / после "нового"? - PullRequest
2 голосов
/ 14 июля 2011
private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>() {
    public Connection initialValue() { 
         return DriverManager.getConnection(DB_URL);
    }
};

Я не понимаю, что происходит в той части, которая находится внутри звезд.Это способ вставить метод в класс?

Ответы [ 5 ]

5 голосов
/ 14 июля 2011

Это анонимный внутренний класс - см. http://download.oracle.com/javase/tutorial/uiswing/events/generalrules.html#innerClasses

5 голосов
/ 14 июля 2011

Метод initialValue () ThreadLocal - это просто способ создания ThreadLocal, содержащего значение, отличное от нуля.

Редактировать: О, я понимаю, это не то, о чем вы спрашиваете. То, что у вас есть, так же, как если бы вы сделали:

public class MyOwnThreadLocal extends ThreadLocal {
    public Connection initialValue() {
        return DriverManager.getConnection(DB_URL);
    }
}

За исключением того, что ваша версия не требует полностью отдельного определения класса - следовательно, он называется "анонимный класс".

3 голосов
/ 14 июля 2011

Внутри звезд у вас есть анонимный внутренний класс, это означает:

  • вы встраиваете класс в класс (так что это внутренний класс)
  • внутренний класс определенв теле метода (то есть это анонимный внутренний класс)

это синтаксическая комбинация для реализации поведения интерфейса или абстрактного класса без объявления полностью стандартного Java-класса.Вы определяете точное поведение для фиксированного контекста.

Далее, для части ThreadLocal на основе ThreadLocal Javadoc поле connectionHolder управляется многими тегами.

Каждый поток содержит неявную ссылку на свою копию локальной переменной потока, пока поток активен и экземпляр ThreadLocal доступен;после того, как поток уходит, все его копии локальных экземпляров потока подлежат сборке мусора (если не существует других ссылок на эти копии).

Если у вас есть 5 потоков с доступом к connectionHolder, вы найдете 5 ThreadLocal, который управлял 5 экземплярами значения

2 голосов
/ 14 июля 2011

Это Анонимный внутренний класс , который обычно реализует некоторый интерфейс, который является обратным вызовом или чем-то подобным, Swing использует это для слушателей.

В этом случае он реализует метод initialValue() для этого конкретного экземпляра ThreadLocal<Connection>.

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

1 голос
/ 14 июля 2011

Это анонимный внутренний класс. Это короткий синтаксис для расширения базового класса:

<code>class AnonClass extends ThreadLocal<Connector> {
    public Connection initialValue() { 
         return DriverManager.getConnection(DB_URL);
    }
}</p>

<p>private static AnonClass connectionHolder = new AnonClass();

Вы могли бы сделать то же самое с интерфейсами (чаще всего наблюдается при реализации обратных вызовов). Например:

<code>interface Callback {
    void doIt();
}</p>

<p>Callback test = new Callback() {
   public void doIt() { /* ... */ }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...