【发布时间】:2021-10-16 20:56:20
【问题描述】:
我正在尝试在 java 中创建一个小吃机实现。
我创建了一个名为 Product 的抽象类,它将为每个提供的产品提供基本设计。
我的意思是我们有 abstract class Product,然后是其他类,如 Nachos、Cake 等。它们继承自 Product。
Product类不包含太多,它只包含产品的name、price和available amount(这些是类中的字段)。
它还有get 方法,用于只返回每个字段的值。
问题是我想将产品的name 设置为static final,因为如果产品的名称是Nachos,它将不会被更改。我的意思是可以创建更多 Nachos 对象,但它们的类的名称仍将是 Nachos。
所以没有理由不这样做static final。
问题是我不确定如何正确设置。
public abstract class Product {
private static final String productName = getClass().getSimpleName();
private int price;
private int amount;
....
Constructor..
Get methods..
我考虑过getClass().getName() 或getSimpleName(),但它给了我一个IDE 错误,这表明我将该字段也用作static final 并使用getClass 的唯一方法是编写Product.class.getName(); .
问题是,如果我这样做,将返回的名称是 Product 而不是 Cake 或 Nachos 或其他子类。
【问题讨论】:
-
我强烈反对将 getter 返回的值与类名耦合的方法。 --- 为什么不在getter 中写
getClass().getSimpleName();?甚至更好:删除字段,使 getter 抽象,让子类实现它们。 -
@Turing85 我明白你的意思,但为什么不把这个字段设为
static?我的意思是,该类的每个对象的类名称都是相同的,因此Nachos的每个对象都需要运行getClass().SgetSimpleName();而不是已经拥有它。 -
你想多了。一方面,如果我们将
return "Nachos"写在getter 中,这将始终是完全相同的String("Nachos" == "Nachos"将始终评估为true)。另一方面,即使我们要编写getClass().getSimpleName(): 足够频繁地调用它,JVM 也会热编译和优化代码。 --- "premature optimization is the root of all evil" -- Donald Ervin Knuth: Computer Programming as an Art (1974), p. 671 -
感谢您的回答。但是有可能按照我尝试的方式来做吗?以
static final作为字段并对其进行优化,这样每个子类将自动拥有自己的名称,而无需运行getClass()? -
如果您在
Product类中有一个static final String字段,它只能引用一个字符串(即一个类的名称)。Nachos类不能是“Nachos”,Cake类不能是“Cake”,因为它只是Product及其所有子类的一个字段。
标签: java class inheritance static abstract-class