如何根据条件在同一个类中实现两个接口,而不使用任何导入



我想知道当一个类中有两个接口时,我如何一次使用一个接口。例如,当Cube不固定()时,我可以通过接口属性改变它的长度。然而,一旦它被固定,它只能访问接口计算哪个是体积()或面积()。

public interface properties <T> {
T size(int length);
T fixed();
}
public interface calculate{
int volume();
int area();
}
public class Cube implements properties, calculate{
private final int length;
public Cube(int length){this.length = length;}
}

前面提到的形状工厂是我的首选。

然而,如果你真的想控制何时可以开始使用计算方法->我建议抛出一个异常,如果形状不是fixed,并通过继承管理,如

import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public abstract class Calculate {
private boolean fixed = false;
protected abstract int computeVolume();
protected abstract int computeArea();
public int volume() {
if (!fixed) {
throw new UnsupportedOperationException("not yet fixed!");
}
return computeVolume();
}
public int area() {
if (!fixed) {
throw new UnsupportedOperationException("not yet fixed!");
}
return computeArea();
}
}
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Cube extends Calculate {
private int length;
@Override
protected int computeVolume() {
return length * length * length;
}
@Override
protected int computeArea() {
return 6 * (length * length);
}
}
下面是一些需要验证的单元测试:
import static org.junit.Assert.*;
import org.junit.Test;
public class CubeTest {
@Test
public void testCubeWhenFixed() {
Cube cube = new Cube();
cube.setLength(4);
cube.setFixed(true);
int vol = cube.volume();
assertEquals(64, vol);
}
@Test (expected = UnsupportedOperationException.class)
public void testCubeWhenNotFixed() {
Cube cube = new Cube();
cube.setLength(4);
int vol = cube.volume();
}
}

如果您没有在类型级别表示Cube的固定性,那么您的代码将更加难以维护。

我就只有一个可变CubeBuilder:

class CubeBuilder {
private int length;
public void setLength(int newLength) { this.length = newLength; }
public Cube build() { return new Cube(length); }
}

,然后是一个不可变的Cube,它有volumearea

否则,在编写程序时,您将永远无法确定将非固定的Cube传递给哪些方法是可以的,以及给定的Cube引用是固定的还是非固定的。

最新更新