Использовать HashMap для хранения переменных экземпляра? - PullRequest
7 голосов
/ 22 октября 2011

Я хотел бы создать базовый класс, который будет расширять все классы в моей программе. Одна вещь, которую я хотел сделать, - найти единый способ хранения всех переменных экземпляра внутри объекта.

Я придумал, как использовать HashMap для хранения пар ключ / значение для объекта, а затем предоставлять эти значения с помощью метода get и set.

Код, который у меня есть для этого, следующий:

package ocaff;

import java.util.HashMap;

public class OcaffObject {

    private HashMap<String, Object> data;

    public OcaffObject() {
        this.data = new HashMap<String, Object>();
    }

    public Object get(String value) {
        return this.data.get(value);
    }

    public void set(String key, Object value) {
        this.data.put(key, value);
    }

}

Хотя функционально это работает, мне любопытно, есть ли какие-либо реальные проблемы с этой реализацией или есть лучший способ сделать это?

В своей повседневной работе я программист на PHP, и моей целью было подражать функциональности, которую я использовал в PHP в Java.

Ответы [ 2 ]

14 голосов
/ 22 октября 2011

Я не думаю, что это хороший способ справиться с тем, что вы имеете в виду. С моей точки зрения, программирование на Java совершенно отличается от программирования на php.

Вы должны поддерживать чистоту и строгую типизацию, используя реальную парадигму чистого объектно-ориентированного программирования.

Некоторые проблемы с этой техникой приходят мне на ум, вот некоторые, не в порядке важности.

  1. Первая проблема, с которой вы столкнулись, это производительность и объем памяти: она потребляет много памяти и работает очень плохо.

  2. Вторая проблема - параллелизм, HashMap не является потокобезопасным.

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

  4. Четвертая проблема - отладка ... будет сложно отладить ваш код.

  5. Пятая проблема: каждый может написать и прочитать любое поле, зная свое имя.

  6. Шестая проблема: когда вы изменяете имя поля в хэш-наборе, вы не получаете никакой ошибки времени компиляции, вы получаете только странное поведение во время выполнения. Рефакторинг станет невозможным.

Типизированные поля гораздо более полезны и чисты.

1 голос
/ 22 октября 2011

Если вы потратите время на то, чтобы сделать урок для этого, я просто добавлю то, что вам нужно в качестве членов класса.Это даст вам время для проверки ваших учеников во время компиляции, значительно уменьшая ваши тонкие ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...