#java #variables #state
#java #переменные #состояние
Вопрос:
Сначала у меня был класс A, который принимал список B в качестве аргумента конструктора. Этот список B содержался в классе A в переменной. Другому классу, который использовал этот класс A, нужны были данные в списке B, но по-другому. Итак, я создал конкретный объект C и имел метод getSomething() в классе A, который на лету создал один из этих объектов C на основе информации в исходном списке B. Это сработало нормально.
Затем оказалось, что классу, который вызвал getSomething(), потребовалось немного дополнительной информации, которую не содержал исходный список B. Однако небольшое вычисление для конкретных элементов в списке B дало мне эту информацию. Эту информацию необходимо было добавить к объекту C. Это вычисление немного тяжеловато, поэтому я не хочу делать это на лету, когда я создаю объект C в getSomething() . Это вызвало у меня проблему, поскольку я не могу обновить какие-либо элементы объекта C этой вычисляемой информацией, поскольку элементы объекта C еще не существуют, они создаются в getSomething() .
Как мне решить это наилучшим образом. Возможно, существуют какие-либо шаблоны?
-
Должен ли я в конструкторе класса A преобразовать элементы в списке B в список объекта C, а затем отбросить список B, а затем выполнить вычисление и обновить все элементы объекта C?
-
Должен ли я сохранить как исходный список B, так и список объектов C и иметь две переменные с почти одинаковой информацией, просто представленные по-другому?
-
Или что-то еще?
Редактировать: C не является расширением элемента в списке B, более того, один или несколько элементов в списке B объединены в C.
Комментарии:
1. если я понял.. разве C не должен наследоваться от A?
2. Можете ли вы включить пример кода? : P
Ответ №1:
Если вы можете внести изменения в список B, чтобы создать список C без потери информации, необходимой классу A (другими словами, если класс A может нормально функционировать только со списком C), тогда да, вычисление этого в конструкторе и отказ от сохранения B кажется хорошей идеей.
Однако, если вам также нужны исходные данные, класс A может сохранить оба. В случае, если вы знаете, какая информация будет одинаковой в списке B и списке C, вы можете предоставить экземпляру списка C ссылку на список B, чтобы он мог хранить только ту информацию, которая отличается, и может ссылаться на информацию в списке B, когда запрашивается что-то, что не изменилось.
Ответ №2:
Объяснение, вероятно, более запутанное, чем реальная проблема.
AFAICT вам нужен оформленный B, где оформленный список вычисляется в конструкторе A.
Независимо от того, является ли это копиями объектов B или составной ссылкой на оригиналы (или что-то еще), зависит от ваших реальных потребностей.