Каковы преимущества и недостатки создания защищенного конструктора класса - PullRequest
3 голосов
/ 23 декабря 2011

У меня есть глупое сомнение, но я хотел бы услышать некоторые мнения по этому поводу.

У меня есть суперкласс (MySuperClass), а затем у меня есть около 70 классов, унаследованных от этого суперкласса (классы Bean).

Цель этого суперкласса - реализовать метод "toString" с помощью отражения, и таким образом я проверяю, что все эти 70 классов будут иметь метод toString. Эти 70 классов являются компонентами, и конечная цель - записать информацию о классе, а не только экземпляр класса.

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

С уважением,

Fer

Ответы [ 3 ]

6 голосов
/ 23 декабря 2011

Если ваша цель - убедиться, что MySuperClass никогда не создается непосредственно через new MySuperClass(), а только его подклассы, тогда имеет смысл объявить класс abstract;см. http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html. Вот и весь смысл абстрактных классов.Тогда конструктор может быть либо public, либо protected, это не имеет значения.

Причина, по которой все конструкторы protected входят в класс non - abstractбыло бы, если бы вы do намеревались создать экземпляр самого класса, используя new MySuperClass(), но хотели бы, чтобы его экземпляр создавался только подклассами и другими членами его пакета (такими как "фабрика")«объект».Хотя это не похоже на то, что вы пытаетесь сделать.

1 голос
/ 23 декабря 2011

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

С учетом сказанного, я бы предпочел, чтобы класс был абстрактным. Защищенные конструкторы не могут помешать подклассу или любому классу в том же пакете произносить BaseClass x = new BaseClass();. Защищенный конструктор говорит мне: «Код может где-то создавать экземпляр этого класса» и дает мне еще одну вещь, которую нужно отслеживать.

1 голос
/ 23 декабря 2011

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

public class A{
   private static A instance = null;
   protected A() {
      // Exists only to defeat instantiation.
   }
   public static A getInstance() {
      if(instance == null) {
         instance = new A();
      }
      return instance;
   }
}
...