在 java 中返回多个原始对象。不推荐?

2024-04-20

我刚刚开始学习 Java 的 OOP 编程。我已经用 C++ 编写过一些程序,而我在 Java 中最怀念的事情之一就是可以返回多个值。确实,C++ 函数仅严格返回一个变量,但我们可以使用按引用参数返回更多变量。相反,在Java中我们不能做这样的事情,至少对于原始类型不能。

我想到的解决方案是创建一个类,对我想要返回的变量进行分组,并返回该类的实例。例如,我需要在数组中查找一个对象,并且我想返回一个布尔值(是否找到)和一个索引。我知道如果没有找到任何内容,我可以将索引设置为 -1,但我认为其他方式更清楚。

问题是,一个对 Java 的了解比我了解得多的人告诉我,我不应该为了返回多个值(即使它们是相关的)而创建类。他告诉我们,类永远不应该用作 C++ 结构,而只是为了对元素进行分组。他还说方法不应该返回非原始对象,它们应该从外部接收对象并只修改它。这些事情中哪些是真的?


我不应该为了返回多个值而创建类

类永远不应该用作 C++ 结构,而只是为了对元素进行分组。

方法不应该返回非原始对象,它们应该从外部接收对象并且只修改它

对于上述任何陈述,情况绝对不是这样。数据对象很有用,事实上,将纯数据与包含繁重逻辑的类分开是一种很好的做法。

在 Java 中,最接近结构体的是 POJO(普通的旧 Java 对象),在其他语言中通常称为数据类。这些类只是一组数据。 POJO 的经验法则是它应该只包含基元、简单类型(字符串、装箱基元等)、简单容器(映射、数组、列表等)或其他 POJO 类。基本上可以轻松序列化的类。

想要将两个、三个或多个配对是很常见的n对象在一起。有时,数据足够重要,足以保证一个全新的类别,而在其他情况下则不然。在这些情况下,程序员经常使用Pair or Tuple类。这是一个二元素通用元组的简单示例。

public class Tuple2<T,U>{
    private final T first;
    private final U second;

    public Tuple2(T first, U second) {
        this.first = first;
        this.second = second;
    }

    public T getFirst() { return first; }
    public U getSecond() { return second; }
}

使用元组作为方法签名一部分的类可能如下所示:

public interface Container<T> {
     ...
     public Tuple2<Boolean, Integer> search(T key);
}

创建这样的数据类的一个缺点是,为了生活质量,我们必须实现诸如toString, hashCode, equalsgetter、setter、构造函数等。对于每个不同大小的元组,您必须创建一个新类(Tuple2, Tuple3, Tuple4, ETC)。创建所有这些方法会给我们的应用程序带来微妙的错误。由于这些原因,开发人员通常会避免创建数据类。

像 Lombok 这样的图书馆对于克服这些挑战非常有帮助。我们的定义Tuple2,使用上面列出的所有方法,可以写为:

@Data
public class Tuple2<T,U>{
    private final T first;
    private final U second;
}

这也使得创建自定义响应类变得非常容易。使用自定义类可以避免泛型自动装箱,并大大提高可读性。例如:

@Data
public class SearchResult {
    private final boolean found;
    private final int index;
}
...
public interface Container<T> {
     ...
     public SearchResult search(T key);
}

方法应该从外部接收对象并且只修改它

这是个坏建议。围绕不变性设计数据要好得多。从《有效的 Java》第二版,第 75 页 https://the-eye.eu/public/Books/IT%20Various/Effective%20Java%2C%202nd%20Edition.pdf

不可变对象很简单。不可变对象只能处于一种状态,即创建它时的状态。如果您确保所有构造函数都建立了类不变量,那么就可以保证这些不变量将始终保持正确,而您或使用该类的程序员无需付出任何进一步的努力。另一方面,可变对象可以具有任意复杂的状态空间。如果文档没有提供由 mutator 方法执行的状态转换的精确描述,则可靠地使用可变类可能会很困难或不可能。

不可变对象本质上是线程安全的;它们不需要同步。它们不会被同时访问它们的多个线程破坏。这无疑是实现线程安全的最简单方法。事实上,任何线程都无法观察到另一个线程对不可变对象的任何影响。所以,不可变对象可以自由共享.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 java 中返回多个原始对象。不推荐? 的相关文章

  • 非常大的 JTable、RowFilter 和额外负载

    我想请求澄清 RowFilter 的使用及其对性能的影响 我通过 include Entry 方法实现了一个过滤器 对于每一行 只需检查模型中其对应值是否设置了布尔标志 如果是 则返回 true 否则返回 false 现在 我拥有的 JTa
  • null != Something 和 Something != null 之间的区别

    之间有区别吗null something and something null在爪哇 如果有区别 那么我应该使用哪一个 为什么 之间没有区别null something and something null 你一定在想person getN
  • 如何使用 Talend Open Studio Data Integration 创建属性文件?

    我曾经使用 Talend Open Integration studio 创建作业并从 IDE 运行它或将其导出为可执行 jar 文件 但我并没有广泛使用它 是否可以创建一个包含不同服务器名称和其他变量的外部配置文件 以便在创建 Talen
  • 使用Optional验证输入

    我有一个 CreateOrder 实例 其中包含一些 String Integer 和 Double 状态 当我在 JUnit 测试中为 CreateOrder 创建一个对象并将其发送出去时 我可以使用可选 API 验证 String 属性
  • 让线程休眠的更好方法

    我一直在编写有关 Java 8 中 2D 图形的教程 当时 NetBeans 给了我一个提示 Thread Sleep会影响性能 然而 尽管我已经找到了几种更好的方法 但我还没有找到一种方法来包含它们而不弄乱代码 package platf
  • 如何在 Intellij IDEA 中为 Apache Tomcat 指定自定义 JRE 路径?

    问题是如何指定自定义JRE路径为Apache tomcat in Intellij IDEA 当从以下位置启动应用程序时IDEA 看来 只需配置它的路径 路径jvm dll in Apache Tomcat监视器没有帮助 还有其他想法或方法
  • “赠送”应用内购买 Android

    有没有办法将 Google Billing 中的应用内购买 赠送 给特定帐户 我把这个问题放在这里是因为如果有一种方法可以以编程方式完成它 那很好 但不是必须的 在官方文档中找不到任何相关内容 我想要这个的原因是因为我的一个应用程序目前处于
  • TarsosDSP 音高分析傻瓜式教程

    我正在开发一个分析声音文件音调的程序 我遇到了一个非常好的 API 称为 TarsosDSP 它提供了各种音高分析 然而 我在设置它时遇到了很多麻烦 有人可以向我展示一些有关如何使用此 API 特别是 PitchProcessor 类 的快
  • 如何将 JTextField 添加到 JFrame 的菜单栏?

    我一直在尝试重载 JMenu 并放入一些自定义代码来支持 JTextField 但进展并不顺利 我在这里的主要目的是在菜单项的右侧添加一个搜索字段 因此 我在左侧有 文件 编辑 帮助 之类的东西 然后在右侧是搜索栏 几乎就像某些浏览器中的谷
  • 将 uiautomator 测试用例与 Android 中的应用程序代码集成

    我正在使用 Eclipse IDE 这是我的 uiautomator 测试用例代码 public class caltest extends UiAutomatorTestCase public void testDemo throws U
  • Java ArrayList,在一行中获取多种类型(int、String 等)的用户输入

    我正在努力提高 Java 水平 我遇到的一个问题是获取用户输入 所有这些都在一行中 如下所示 System out println Please input numbers that you would like to work with
  • 如何在 JasperReports 中解码 html 实体

    我有一些用 JasperReports 编写的报告 它们按字面意思显示 html 实体 例如 项目符号点 使用 html 实体文本表示显示 8226 你知道有什么办法吗 In the textField设置markup属性为html 这是如
  • Spring方法获取给定类型的所有bean

    我试图从一个相同类型的豆子中获取所有豆子FileSystemXmlApplicationContext 我正在使用factory getBeansOfType SomeType class 但我注意到它只返回顶级 bean 是否有任何其他方
  • 无法初始化类 io.confluence.kafka.schemaregistry.client.rest.RestService

    我正在尝试使用 KafkaAvroSerialzer 设置一个卡夫卡生产者以获得价值 当 rit 尝试创建生产者时 我遇到了这个错误 我正在使用 confluence 5 2 1 中提供的所有罐子 java lang NoClassDefF
  • Java中使用final关键字会提高性能吗?

    在 Java 中 我们看到很多地方final可以使用关键字 但其使用并不常见 例如 String str abc System out println str 在上述情况下 str can be final但这通常被忽略 当一个方法永远不会
  • 为什么这个 SimpleDateFormat 无法解析这个日期字符串?

    简单日期格式 SimpleDateFormat pdf new SimpleDateFormat MM dd yyyy hh mm ss SSSaa 抛出的异常pdf parse Mar 30 2010 5 27 40 140PM java
  • 如何使用正则表达式提取子字符串

    我有一个字符串 其中有两个单引号 特点 单引号之间是我想要的数据 如何编写正则表达式从以下文本中提取 我想要的数据 mydata some string with the data i want inside 假设您想要单引号之间的部分 请
  • 从自定义类导入时,XMLBeans jar 无法签名

    在 NetBeans 中 我创建了一个 Exporter 类 该类使用 APACHE POI 将一些数据导出到 EXCEL 文件 而 APACHE POI 使用 XMLBeans 我通过下载 zip 二进制文件并手动添加 jar 来添加 A
  • 如何使用 Maven 创建新的 Eclipse RCP 项目?

    如何使用 Maven 创建新的 Eclipse RCP 项目 最好是m2eclipse http maven apache org eclipse plugin html 我读到有一个关于 Eclipse 的 Maven 插件 Maven
  • onActivityresult 数据为空

    这是我的相机应用程序 我想在其中捕获图像并裁剪它 但它拍照保存在我的 myimage 目录中 但不执行裁剪功能 请我需要帮助 我是这个领域的新人 这是我的相机开源代码 Intent intent new Intent MediaStore

随机推荐

  • Windows 8 Internet Explorer 10 仍然有怪异模式吗?

    我想知道 Windows 8 上的 IE10 是否仍然有 Quirksmode 因为我们有一个 Web 应用程序 仍然 可以与 quirksmode 配合使用 我想知道它是否仍然可以在 Windows 8 上运行 IE10 有两种怪异模式
  • NotificationCompat v7 不适用于 Oreo 及更高版本的操作系统

    我遇到了麻烦NotificationCompat v7 on android 8 9 在所有 Android 版本上显示通知的最佳方式是什么 调试日志 android app RemoteServiceException Bad notif
  • 在 Android Studio 中重用模块

    每当我将 android 库项目作为模块添加到 Android Studio 项目时 源代码都会被复制到 Android Studio 项目文件夹中 有没有办法像在 eclipse 中一样解决这个问题 其中只有一个库项目副本 任何多个项目都
  • 如何从嵌套母版页中的内容页面访问主母版页中的控件

    我有 2 个嵌套的母版页 这是主母版页代码 例如
  • http handler 接口中 bool IsReusable 的意义

    当编写 http 处理程序 模块时 需要实现一个名为 的接口成员bool 是否可重用 https learn microsoft com en us dotnet api system web ihttphandler isreusable
  • jQuery:如何用逗号对一列数字求和?

    我使用了网上找到的以下功能 效果非常好 然而 当我的用户后来要求在数字中包含逗号时 它就崩溃了 它仅添加逗号前面的数字 这是函数 function sumOfColumns tableID columnIndex hasHeader var
  • 空白链接在同一窗口中打开 - 为什么以及如何修复它? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有四个链
  • 类型错误:无法读取 Jasmine 中未定义的属性(读取“订阅”)

    我正在尝试为以下方法编写测试用例 subscriptionPackages this managePackageService getPackages subscribe response gt this packagePlan respo
  • 该应用程序的开发人员尚未正确设置该应用程序以进行 Facebook 登录?

    我正在尝试在我的脚本中使用 Facebook 进行登录 我已经完成了所有操作 但是当我尝试使用 Facebook 帐户登录时 我从 Facebook 收到此错误 Error 应用程序未设置 此应用程序的开发人员尚未正确设置此应用程序以进行
  • std::vector 当 Foo 的某些成员是引用时

    只要有可能 我通常更喜欢使用引用而不是指针 在我看来 它使语法更清晰 在这种情况下 我有一堂课 class Foo public Foo Bar bar bar bar private Bar bar operator 对于这样的类 编译器
  • 在对数时间内找到未排序数组中的最小值

    是否有一种算法方法可以在对数时间 O logn 内找到未排序数组的最小值 或者只能在线性时间内实现 我不想并行 Thanks Michael 如果列表未排序 则您的搜索必须至少是线性的 每个项目你必须至少看一遍 因为任何你没看过的东西mig
  • 修复 npm 安装失败并显示错误代码 EINTEGRITY

    我在这里浏览了各种类似的帖子但无济于事 他们都得出了类似的解决方案npm cache verify or npm cache clear etc 我什至使用一切可能的方法完全删除 npm 和 node 并重新开始 我什至诉诸使用 force
  • 谷歌地图多边形 - 叠加

    我正在尝试在我的谷歌地图上实现 负 覆盖 类似于您在estately com 上获得的效果 基本上 我已经根据收集的 KML 数据成功绘制了地图多边形 当有多条路径时 它们绘制得很好 因此 在对我的示例进行建模时 首先 我从 Polygon
  • 如何将复选框绑定到Vuex存储?

    我有一个包含一些复选框的组件 我需要能够访问从 Vue 应用程序中的其他组件检查了哪些复选框 但我无法弄清楚 也无法在网上找到 如何将复选框正确连接到我的 Vuex 商店 将组件内的复选框连接到 Vuex 存储的正确方法是什么 以便它们的行
  • 如何确定使用哪种认证方式?

    我想知道 我如何确定正在使用哪种身份验证方法 例如 如果我的身份验证基于 FORMS 身份验证 而不是 WINDOWS 身份验证 我想执行代码 您可以使用配置管理器检查网络配置上的内容 ConfigurationManager GetSec
  • 停放正在使用的线程

    我正在尝试线程停放并决定构建某种服务 它是这样的 public class TestService private static final Logger logger LoggerFactory getLogger TestService
  • 如何使用引脚和选项卡像 Delphi IDE 一样进行拖动和停靠?

    我想让 拖放 和 停靠 在我的应用程序中像在 Delphi IDE 中一样工作 即能够在对象检查器 结构视图周围拖动并将它们停靠在合适的位置 我在将表单对接到 PageControl 方面取得了相当大的成功 但想知道是否有人知道如何让它与小
  • 如何更改 Hybris 站点地图 XML 中的本地主机 URL

    我正在尝试通过开箱即用的方式为我的 Hybris 站点创建一个 sitemap xml 并复制我的 site impex 中开箱即用商店中给出的 ImpEx 如何更改 Hybris 站点地图 XML 中的本地主机 URL 运行 cronjo
  • 如何在 CDI 中动态创建实例

    假设我有一个汽车课程 在我的代码中我想创建 10 辆汽车 汽车类有一些 Inject带注释的依赖项 做到这一点的最佳方法是什么 CDI 有一个Provider我可以用它来创建汽车的界面 Inject Provider
  • 在 java 中返回多个原始对象。不推荐?

    我刚刚开始学习 Java 的 OOP 编程 我已经用 C 编写过一些程序 而我在 Java 中最怀念的事情之一就是可以返回多个值 确实 C 函数仅严格返回一个变量 但我们可以使用按引用参数返回更多变量 相反 在Java中我们不能做这样的事情