Java:使类中的包级别构造函数可用于外部包。仅允许项目内的某些类访问构造函数

我正在开发一个图书馆,并试图使一切井井有条。因此,我具有嵌套的包结构和单个类,该类应该可以访问所有其他类的构造函数:

这是我的项目结构:

src
   main
      java
         main
            Main.java
         zoo
            Zoo.java
            animals
               Animal.java
               mammals
                  Dog.java
               fish
                  Salmon.java
               birds
                  Falcon.java

这是我在主要方法中拥有的代码:

Main.java

Zoo zoo = new Zoo(password);
Animal dog = zoo.getDog(name);
Animal salmon = zoo.getSalmon(name);
Animal falcon = zoo.getFalcon(name);

我想阻止用户直接(从zoo包外部)创建动物:

Animal dog = new Dog("Charlie");  //error - constructor isn't public

但是我不确定如何实现它。我可以将所有类放在zoo包中,并使动物构造函数只能在包级别访问。 但是,我将不得不牺牲软件包的结构 e,而我宁愿不这样做。

Zoo.java

public class Zoo {
    private String password;

    public Zoo(String password)  {this.password = password;}

    public Dog getDog(String name)  {return new Dog(name);}

    public Salmon getSalmon(String name)  {return new Salmon(name);}

    public Falcon getFalcon(String name)  {return new Falcon(name);}
}

Animal.java

public abstract class Animal {
    protected String name;
    public Animal(String name)  {this.name = name;}
}

动物

public class Dog extends Animal {
    public Dog(String name) {super(name);}
}
public class Salmon extends Animal {
     public Salmon(String name) {super(name);}
}
public class Falcon extends Animal {
    public Falcon(String name)  {super(name);}
}

那么可以做些什么来完成以上工作?也许有某种模式吗?

hyklq 回答:Java:使类中的包级别构造函数可用于外部包。仅允许项目内的某些类访问构造函数

要保留包结构并确保用户将使用Zoo实例实例化动物, 您可能必须在Zoo类中使用私人工厂。但这似乎是一个非常尴尬的解决方案:

public class Falcon extends Animal {

    protected Falcon() {
    }

    protected static Falcon create() {
        return new Falcon();
    }
}

---

public class Dog extends Animal {

    protected Dog() {
    }

    protected static Dog create() {
        return new Dog();
    }
}


---

public class Zoo {

    public Falcon getFalcon() {
        return new FalconFactory().get();
    }

    public Dog getDog() {
        return new DogFactory().get();
    }

    private static class FalconFactory extends Falcon {
        private Falcon get() {
            return create();
        }
    }

    private static class DogFactory extends Dog {
        private Dog get() {
            return create();
        }
    }
}

我认为这不是一个好主意,但是确实迫使用户使用Zoo实例来创建动物。

当然,用户仍然可以创建自己的工厂,该工厂继承自Falcon或Dog。

本文链接:https://www.f2er.com/3122490.html

大家都在问