gpt4 book ai didi

java - 扩展接口(interface)来更改合约,但不更改 API

转载 作者:行者123 更新时间:2023-12-02 01:33:06 25 4
gpt4 key购买 nike

(我不确定标题术语是否正确。)

假设我正在尝试为可读、可写以及可读写“属性”创建一些抽象。根据情况,我可能只想接受可读属性、仅接受可写属性或两者(可读和可写)。但是,假设我希望两种类型的属性从同一父类(super class)型派生其核心方法,但我也想维护类型安全(例如,如果我请求一个可读属性,我想确保我将获得一个可读属性)。

这是Property super 接口(interface)的样子:

public interface Property {
// Readable property core methods

/**
* Blah blah...
* @throws UnsupportedOperationException if this property is not readable.
*/
X readAsX();
...

// Writable property core methods

/**
* Blah blah...
* @throws UnsupportedOperationException if this property is not writable.
*/
void writeX(X value);
...
}

需要注意的重要一点是,如果 Property 不可读/不可写,则指定在适当的情况下抛出 UnsupportedOperationException

现在,以下是定义 ReadableProperty 的适当方法吗? (WritableProperty 的定义类似。)

public interface ReadableProperty extends Property {
// Readable property core methods

/**
* Blah blah...
* Not allowed to throw UnsupportedOperationException: must be readable!
*/
X readAsX();
...

// Writable property core methods

/**
* Always throws UnsupportedOperationException: this property is not writable.
*/
default void writeX(X value) {
throw new UnsupportedOperationException();
}
...
}

注意没有添加新方法;所改变的只是现有方法有更严格的规范。对于所描述的情况,这种设计是否合适?

(注意:这个场景是虚构的。我更关心这个想法而不是它的具体应用。)

最佳答案

为什么不简单地使用两个抽象类,每个抽象类只实现一种方法?

public abstract class ReadableProperty implements Property {
// Readable property core methods
// Writable property core methods

/**
* Always throws UnsupportedOperationException: this property is not writable.
*/
@Override
final void writeX(X value) {
throw new UnsupportedOperationException();
}

}

实际上,您正在实现接口(interface)的方法,而不是为接口(interface)中新引入的签名定义默认行为(这是引入默认修饰符的主要原因)

关于java - 扩展接口(interface)来更改合约,但不更改 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55727840/

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