Должен ли я иметь две разные переменные в одном классе, которые представляют почти одно и то же

#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 или составной ссылкой на оригиналы (или что-то еще), зависит от ваших реальных потребностей.