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

标签 java oop design-patterns

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

这是我的项目结构:

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/

相关文章:

java - 如何提取 JSON 值?

java - cplex - 矩阵值和索引的最小化和求和

java - 如何动态判断Java程序运行时内存使用情况?

java - Java 8 接口(interface)默认方法中使用的阴影变量

c++ - 为什么类内初始化程序中不允许使用 double

c++ - 如果派生类只包含自动变量成员,是否需要有虚析构函数?

java - Java Server 启动时服务运行的设计

java - 从另一个类访问对象方法

linq - 使用 IQueryable<T> 的设计模式

Java通用工厂模式实现