gpt4 book ai didi

java - 如何解决 Java 中没有子包可见性的问题

转载 作者:行者123 更新时间:2023-11-30 05:45:12 24 4
gpt4 key购买 nike

当我使用 DDD 编写一个新组件时,我尝试在一个包中包含一个 public 类,该包中的所有协作者都受到包保护

这通常效果很好,因为只有一个入口点可供我的组件的客户端使用。所有(内部)协作者都将被隐藏。

考虑一个例子,客户可以驾驶我专门构建的 Java 汽车。我不希望客户端看到车辆的所有内部部件,因此只有 Car 类公开为公共(public):

org.automobile
|- Car <-- only Car is public
|- Engine <-- all collaborators have default (package-protected) visibility
\- Battery

现在,随着领域的发展,事情通常会变得更加复杂,所以我想将类与他们的合作者一起移动到子包中,以保持我的结构整洁:

org.automobile
|- Car
|- drive.Engine <-- how to make this only available to Car
|- drive.Spark
|- drive.Belt
|- electric.Battery <-- and this
\- electric.BatteryCell

我现在想让 EngineBatteryCar 可见,,因为我的客户端组件应该仍然无法直接使用这些类。

我知道 Java 中没有“子包”可见性,但是除了使用 Java 9 模块之外,还有其他轻量级模式可以实现我想要的功能吗?

最佳答案

我想说有两种选择。任何人都可以随意参与,因为这个问题很有趣。

对 Java 代码使用单个文件而不是包

这个想法是,您可以使用单个 java 文件来声明 Car.java(引擎和电池)可用的类和 API。声明汽车隐藏概念的类(Spark、Belt、BatteryCell)应该是私有(private)的和静态的,这样它们就不会与声明类有隐式链接。

这种方法可以扩展,但需要更多的工作。在某种程度上,它也是有帮助的,它不适合大型代码库,也不适合将来会扩展的大型代码库。

 org.automobile
|- Car
|- Engine.java <-- how to make this only available to Car
|- Engine.java-Spark <--private static class in File Engine.java
|- Engine.java-Belt <--private static class in File Engine.java
|- Battery.java <-- package private class
\- Battery.java - BatteryCell <--private static class in File Battery.java

将abstract和protected修饰符与子包结合使用

这个想法是创建公共(public)抽象类,其功能由 protected 方法公开。例如 AbstractBattery 和 AbstractEngine。然后,您可以创建一些充当“代理”的类,使用 Car 包中的包私有(private)实现来扩展抽象类,并覆盖您想要提供的方法。例如发动机和电池。汽车将有权访问抽象类的重写方法。另一个副作用是您的 AbstractClass 中不能有最终的 API 方法。

这种方法更适合大型代码库,旨在隐藏功能和抽象以防止意外使用。然而,这还需要一些工作。当然其他人仍然可以扩展AbstractBattery和AbstractEngine并使用它们。

org.automobile
|- Car
|- Engine <-- extends AbstractEngine, is package private, overrides methods that Car needs to access
|- Battery <-- extends AbstractBattery,is package private, overrides methods that Car needs to access
|- drive.AbstractEngine <-- Public abstract class with no public methods, methods that are needed by Engine and Car are protected.
|- drive.Spark <-package private
|- drive.Belt <-package private
|- electric.AbstractBattery <--Public abstract class with no public methods, methods that are needed by Battery and Car are protected.
\- electric.BatteryCell <-package private

下面是一个示例:

org.automobile.engine.AbstractEngine

package org.automobile.engine;

public abstract class AbstractEngine {

protected void startEngine(){
System.out.println("Zoom Zooomm Zoommm");
}
}

org.automobile.Engine

package org.automobile;

import org.automobile.engine.AbstractEngine;

final class Engine extends AbstractEngine {

@Override
protected void startEngine(){
super.startEngine();
}
}

关于java - 如何解决 Java 中没有子包可见性的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54982547/

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