有多种方法可以在 Java 中构建对象。对于我的用例,让我们假设我有一个抽象的 Person
类,其中包含私有属性字段和一个名为 Tom
的子类。
1. Getters/Setters
Person
类中的无参数构造函数、设置器和获取器。可以通过使用龙目岛的@Data注释来简化。
Tom tom = new Tom(); // Subclass of Person
tom.setName("Tom");
tom.setAge(42);
我知道除非使用框架,否则应该避免使用这种方法。
2.参数化构造函数
使用构造函数参数生成对象。对于具有各种可选和必需属性的大对象,构造函数重载过多。也可以使用Project Lombok的各种构造函数注释进行简化。
Tom tom = new Tom("Tom", 42);
然后,汤姆
的构造函数会调用超级(“汤姆”,42)
。在个人中
,如果有许多可选参数,则可以使用构造函数重载。
3.构建器模式
因为构造函数重载会变得非常混乱,非常快,JoshBloch提出了构建器模式。同样,这可以通过ProjectLombok的@Builder注释来简化。这是非抽象的<code>Person
Person person = new Person.Builder().name("Tom").age(42).build();
正如其他人在我之前所说,尝试将构建器模式与继承一起使用是困难的(但并非不可能)。
我确信构建对象的方法还有很多,但我只列出了我熟悉的方法。
我的问题是:使用Java8甚至Java9功能,构建一个对象的绝对最佳方法是什么,该对象是具有必需和可选属性的抽象超类的子类?
许多关于SO的教程和问题已经过时了,并且可能没有强制执行当今被认为是最佳实践的内容。
不幸的是,在Java和OO中,什么是最佳实践是非常主观的,但是我尝试列出一些最客观的标准:
> < li>
无论该类是否是子类,都不应该影响该类的API,包括其构造函数应该是什么样子。
对象应在构造后准备好使用。这意味着其所有公共方法都应在构造函数之后工作。这将取消您的选项 #1 的资格。(除非被不友好的框架强迫)。
有一个“主”构造函数来完成这项工作,并让所有其他构造函数调用这个。除非你有一个也有许多构造函数的超类,在这种情况下事情会变得更加复杂,否则你很可能必须镜像超类想要的东西。
它应该易于使用且直接。这意味着,最好使用构造函数而不是构建器,除非使用它们变得困难。如果有很多参数(对我来说超过3-4个),或者它们的组合太多了(再次,对我来说超过3-4),或者有一个构造深度(必须首先构造其他对象),那么我会使用构建器。
在任何情况下都不要使用< code>Optional作为参数。
不要用龙目语。它可能会让你(作者)的生活更容易,但会让所有必须阅读代码的人感到困惑。记住,我们读代码的次数比写代码的次数多得多!(这可能是一个值得商榷的点)
继承很棘手,如果可能的话,应该避免。不要使用它来共享代码,这是一种反模式。建筑商也是如此。您可以编写一个可以返回不同实现类的构建器,但它不必(也不应该)子类化其他构建器。
我可能忘记了一些规则,但除此之外,Java8和9中没有新的突破性语法来简化构造。
问题内容: 我得到了几种解释,但是到目前为止,我还无法理解Java中的抽象类和方法是什么。 有人说它必须与程序的安全性做些关系,另一些人说不是那样。 即使从Dietel&Dietel的书中,我也不明白它的目的。我们何时,何地,为什么使用它? 请像您正在教初学者一样进行解释,非常感谢您的帮助。 问题答案: 抽象类是无法实例化的类。唯一的目的是扩展其他类。 抽象方法是抽象类中的方法(必须声明为抽象),
我通过学校为一项任务提供的简报创建了一个飞机座位预订系统。我遇到了一个我无法解决的主要问题。 摘要说明抽象类必须有一个抽象方法和大约4个公共方法。在抽象类的两个子类中,我们都必须初始化对象数组(所有普通的座位)。然而,一旦它们被初始化,我不知道如何将它们发送回抽象类(该类有一个检查未预订的飞机座位的方法,这就是我需要初始化的座位对象的地方) ArrayIndexOutOfBounds在一个应该在边
下面是解释我的情况的基本框架代码。 这是超级抽象类: 这是超级抽象类的一个子类:(注意,我删除了其他函数,比如构造函数和方法,以缩短文章的篇幅 我想在抽象类中使用这种公共无效支付(int金额)方法;然而,超级抽象类Person不会接受支付(付款),因为该方法不在范围内。如何使这个工作? 谢谢~
问题内容: 动物是狗的超类,狗有一种叫bark的方法 考虑以下: 会发生什么? the assignment isn’t allowed the call to bark is allowed and “woof” is printed at run time the call to bark is allowed but nothing is printed the call to bark c
本文向大家介绍php中的抽象方法和抽象类,包括了php中的抽象方法和抽象类的使用技巧和注意事项,需要的朋友参考一下 1、什么是抽象方法? 我们在类里面定义的没有方法提的方法就是抽象方法。所谓的没有方法体指的是,在声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时方法还要加一个关键字"abstract"来修饰。 例如: 2、什么是抽象类? 只要一个类里面
我有一个子类,它声明了我的抽象超类中的所有方法,但它仍然给我一个错误,说明我的类不是抽象的。我不知道为什么会抛出这个错误。 我得到的具体错误是 PhoneBookEntry.java: 1:错误:PhoneBookEntry不是抽象的,并且不会覆盖可比中的抽象方法compareTo(Object) 我的问题代码: 还有我的子类: