1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License.
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.lang.ref;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Implements a phantom reference, which is the weakest of the three types of
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * references. Once the garbage collector decides that an object {@code obj} is
38016a87c7952b25eededfc222615e25a5a72bcddaScott Main * phantom-reachable, it is being enqueued
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * on the corresponding queue, but its referent is not cleared. That is, the
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reference queue of the phantom reference must explicitly be processed by some
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * application code. As a consequence, a phantom reference that is not
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * registered with any reference queue does not make any sense.
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Phantom references are useful for implementing cleanup operations that are
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * necessary before an object gets garbage-collected. They are sometimes more
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * flexible than the {@link Object#finalize()} method.
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class PhantomReference<T> extends Reference<T> {
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new phantom reference and registers it with the given
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * reference queue. The reference queue may be {@code null}, but this case
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * does not make any sense, since the reference will never be enqueued, and
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the {@link #get()} method always returns {@code null}.
55f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param r the referent to track
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param q the queue to register the phantom reference object with
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PhantomReference(T r, ReferenceQueue<? super T> q) {
60ba1e5f9b7ffe3a42f1001ece077f566de8231548Carl Shapiro        super(r, q);
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns {@code null}.  The referent of a phantom reference is not
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * accessible.
66f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code null} (always)
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public T get() {
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
74