Сколько байт у класса без состояния? - PullRequest
2 голосов
/ 21 марта 2012

Если у меня есть эти классы:

public interface IBinaryCalculator{
double addition(double numb1, double numb2);
}

public class BinaryCalculator implements IBinaryCalculator{
 double addition(double numb1, double numb2){
  return numb1+numb2;  

}
}

Хорошо, метод должен быть статическим, но у меня здесь есть интерфейс. Является ли синглтон единственным ответом и есть ли в классе BinaryCalc? Допустим, я собрал 10 000 BinaryCalculator, у него просто есть методы, он влияет на производительность или мне следует использовать синглтон.

Ответы [ 5 ]

1 голос
/ 21 марта 2012

В этом конкретном классе нет ничего, что не могло бы быть "статичным".

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

«Синглтон» - это одно (простите за каламбур; -)).

«Статика» - это нечто другое.

А масштабируемость - это еще одна отдельная проблема.

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

ИМХО ...

1 голос
/ 21 марта 2012

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

ИМХО, вам следует сначала побеспокоиться о дизайне, ипозже вы можете беспокоиться о производительности, если такие вещи станут проблемой.Честно говоря, ваш класс не похож на тот класс, для которого у вас будет миллион объектов, плавающих в куче.

Ваш интерфейс - это то, что называется SAM Type (единственный абстрактный метод).И их множество в самом JDK.Например, java.util.Comparator и java.lang.Comparable являются двумя хорошими примерами.

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

Упомянутый вами шаблон синглтона предназначен для предотвращения создания более чем заранее определенного числа экземпляров данного класса, чаще всего они ограничивают его одним экземпляром.В вашем дизайне неясно, почему вы хотели бы сделать такую ​​вещь, но беспокойство по поводу производительности, связанное с количеством экземпляров, не кажется здесь лучшей причиной.

В поисках способов упростить ваш дизайн вы можетехотел бы использовать встроенные анонимные внутренние классы, вместо обеспечения реализации класса вашего интерфейса, если вы планируете использовать калькуляторы различных типов, возможно, с классом статического метода фабрики , где вы можете поместить весь свой тип SAMреализации:

public class Calculators {

    public static BinaryCalculator getBasicCalculator(){
        return new BinaryCalculator() {

            @Override
            public double addition(double numb1, double numb2) {
                return numb1 + numb2;
            }
        };
    }

    public static BinaryCalculator getSofisticatedCalculator(){
        return new BinaryCalculator() {

            @Override
            public double addition(double numb1, double numb2) {
                //do any other sofisticated calculation
                return numb1 + numb2;
            }
        };
    }

}

Тогда вы можете просто сделать:

public static void main(String[] args) {
    BinaryCalculator simple = Calculators.getBasicCalculator();
    BinaryCalculator complex = Calculators.getSofisticatedCalculator();

    double result;
    result = simple.addition(10,11);
    result = complex.addition(10,11);
}

Кроме того, если вам разрешено экспериментировать, вы можете попробовать JDK 8Lambda Preview , где вы могли бы написать реализацию своего калькулятора в виде выражения lamdba примерно так:

BinaryCalculator simple = (num1, num2) -> num1 + num2;

Или даже встроенный в метод, например

public class Pair {
        private final double a;
        private final double b;

        public Pair(double a, double b){
            this.a = a;
            this.b = b;
        }

        public double calculateWith(BinaryCalculator calculator){
            return calculator.addition(a,b);
        }
    }

ТогдаВы можете просто предоставить лямбда-реализацию для своего типа SAM следующим образом:

Pair p = new Pair(10,11);
double result = p.calculateWith( (num1, num2) -> num1 + num2 );
System.out.println(result);

Конечно, это всего лишь предварительнаявид JDK 8, но, эй, если вам позволено экспериментировать с последними функциями, это было бы действительно крутое решение: -)

0 голосов
/ 21 марта 2012

Память, используемая одним экземпляром класса, зависит от используемой JVM, а в некоторых случаях - от других.Но заголовки объекта обычно занимают от 8 до 16 байтов.В зависимости от того, что было сделано с объектом, может быть и другое скрытое состояние;например,

  • структура данных "завышенной" блокировки,
  • хранилище для значения хэш-кода идентификатора объекта.

Но есть вероятность, что это не поддается измерениюна производительность вашего приложения.

0 голосов
/ 21 марта 2012

Dont 'do:

10,000  new BinaryCalculator().addition(42,24);

Do:

BinaryCalculator bc = new BinaryCalculator();
10,000  bc.addition(42,24);

Если вы используете:

MemoryMXBean mBean = ManagementFactoryHelper.getMemoryMXBean();
mBean.getHeapMemoryUsage().getUsed()

В изолированном тесте вы должны увидеть getUsed () рост и сокращение в 1-м примере и стабильное использование во 2-м.Вы также можете использовать getUsed (), чтобы понять, насколько быстро используется куча и GC'd.

0 голосов
/ 21 марта 2012

Несколько вопросов, несколько ответов.

  1. Я не уверен, сколько памяти занимает объект без состояния, но ему нужно немного, так как с ним связан монитор.
  2. Для классов этого типа вы можете использовать статический подход, такой как java.lang.Math, или обычный подход, основанный на экземплярах.
  3. Синглтон все чаще считается плохим стилем и его следует использовать с осторожностью.В случае класса без состояния это может быть хорошо, но лично я предпочел бы просто полагаться на пользователей, чтобы не создавать бесполезные объекты.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...