2014-08-11 3 views
0

Я довольно новичок в Java, поэтому мои знания довольно ограничены. Я работаю над личным проектом, где я пытаюсь использовать некоторые методы, используемые в Guava для создания представлений/преобразований коллекций. Я создал класс под названием «Вид», чтобы взять введенный набор в качестве возвращаемого итеративного файла и преобразовать его, а затем представить его как только для чтения итерации. (а не сборник, хотя я не думаю, что это имеет большое значение для этого вопроса). Вот краткий пример его использования ...Как я могу повторно использовать коллекции, которые будут использовать один и тот же фоновый итератор?

public class Node { 
    public enum Change implements Function<Node, Coordinate> { 
    TO_COORDINATE; 
    @Override public Coordinate apply(Node node) { 
     return new Coordinate(node); 
    } 
    } 

    private HashSet<Node> neighborNodes = new HashSet<Node>(); 
    //various other members 

    public View<Coordinate> viewNeighborCoordinates() { 
    return new View<Coordinate>(neighborNodes, Change.TO_COORDINATE); 
    } 
} 

теперь, если какой-либо метод хочет использовать viewNeighborCoordinates() этого узла, а затем какой-то другой метод также хочет viewNeighborCoordinates() этого узла, кажется, расточительно всегда возвращать новые объекты, не так ли? Я имею в виду, что любое количество вещей должно иметь возможность обмениваться ссылкой на представление той же поддержки, которая повторяется с тем же преобразованием, поскольку все, что они делают, это чтение через него. Существует ли установленный способ управления общим пулом объектов, которые могут быть «интернированы», например, «Строки»? Просто нужно сделать какой-то ViewFactory, который хранит список запущенных списков, и каждый раз, когда кто-то хочет просмотра, он проверяет, имеет ли он уже этот вид и передает его? (что еще более эффективно)?

+1

Это возможно, но вряд ли будет полезно. Обтекание объекта вокруг объекта дешево (вероятно, дешевле, чем поиск существующего эквивалентного представления), и если вы не ожидаете одновременного одновременного использования огромного количества одинаковых представлений, это не поможет в использовании памяти. – user2357112

+0

Кроме того, вы смешиваете итераторы и итерации. – user2357112

+0

извините, изменил его на поддержку итерации. – ubanerjea

ответ

1

Как уже говорилось, интернирование возможно (см. Interners), но, скорее всего, плохая идея.

Другая возможность - это ленивая инициализация поля, хранящего View. Поскольку я ленив, я только указываю вам на реализацию Lombok. Будьте осторожны с DCL, если вы хотите попробовать это. Если ваш класс неизменен, вам может не понадобиться синхронизация вообще, например, например. String.hashCode.

Очень простая возможность - это инициативная инициализация поля. Предполагая, что вам нужно представление часто, это лучший способ.

Но, не зная больше, ваша текущая реализация лучше всего. Остерегайтесь root of all evil.

Не оптимизируйте без профилирования или бенчмаркинга (и если вы проверите тест, то сделайте это правильно, то есть используя caliper или jmh. Домашний бенчмаркинг на Java просто не работает).

Смежные вопросы