gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:25:16 26 4
gpt4 key购买 nike

我正在开发一个库并努力让一切井井有条。因此,我有嵌套的包结构和一个应该可以访问所有其他类的构造函数的类:

这是我的项目结构:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com