java 覆盖构造函数_java – 在构造函数中调用可覆盖的方法很糟糕.有例外吗?

我想知道是否存在调用public的情况,或者在这种情况下,特别是抽象类的构造函数中受保护的方法可以正常,或者至少可以原谅,给出足够的方法意图的文档.

我的实际问题涉及一个抽象类IdentifiedConnection,如下所示:

public abstract class IdentifiedConnection extends Connection {

private UUID uuid;

public IdentifiedConnection(String serverAddress, int port) throws IOException {

super(serverAddress, port);

this.uuid = this.aquireIdentifier();

}

public UUID getIdentifier() {

return this.uuid;

}

protected abstract UUID aquireIdentifier() throws IOException;

}

我的目的是从服务器获取UUID标识符.如果服务器以有效的UUID响应,我们在该类的字段中设置该UUID(名为uuid).如果服务器以非UUID消息响应,我们假设服务器由于某种原因无法访问并抛出IOException.

通常我理解从构造函数调用一个可覆盖的方法是不好的,因为它使类容易出现各种或多或少难以检测的错误.然而,在这种情况下,我觉得这样做实际上并不是太糟糕(只要我javadoc地狱了).

你有什么想法?这仍然是一个非常糟糕的主意吗?如果您认为这样做不好,您建议采用哪种替代方法?

我已经从这个问题中删除了Connection类的代码,因为我认为这是无关紧要的.

最佳答案 在这种情况下,我建议你使用工厂方法.

写一个名为的静态方法

public static IdentifiedConnection openConnection(String serverAddress, int port)

throws IOException {

...

}

这样可以更好地控制创建,并避免泄漏对未初始化对象的引用的潜在问题.

另一种方法是采用供应商< UUID>作为构造函数的参数,如下所示:

abstract class IdentifiedConnection extends Connection {

private UUID uuid;

public IdentifiedConnection(String serverAddress,

int port,

Supplier uuidSupplier) throws IOException {

super(serverAddress, port);

this.uuid = uuidSupplier.get();

}

}

在子类中使用它作为

class SomeConnection extends IdentifiedConnection {

public SomeConnection(String serverAddress, int port) throws IOException {

super(serverAddress, port, SomeConnection::createUUID);

}

public static UUID createUUID() {

return ...;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值