我正在开发一个库并努力让一切井井有条。因此,我有嵌套的包结构和一个应该可以访问所有其他类的构造函数的类:
这是我的项目结构:
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
包中,并使动物构造函数只能在包级别访问。 但是,我必须牺牲包结构,但我不想这样做。
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);}
}
那么如何才能实现上述目标呢?也许存在某种模式?
最佳答案
为了保留包结构并确保用户将使用 Zoo 实例实例化动物, 您可能必须在 Zoo 类中使用私有(private)工厂。然而,这似乎是一个非常尴尬的解决方案:
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 的 Factory。
关于Java:使类中的包级构造函数可供外部包访问。仅允许项目内的某些类访问构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58805836/