gpt4 book ai didi

java - Java中的隐式(继承对象),更适合的方式?

转载 作者:行者123 更新时间:2023-12-01 18:24:33 26 4
gpt4 key购买 nike

我感觉使用父级的变量有点破旧。它必须是一种强制子类可见性以使其更加明确的方法。

public abstract class MyClass{

@Autowired
Object implicitObject;

@Test
public void commonTest(){
implicitObject.doSomethingBasic();
}
}

public class MySubClass extends MyClass{

@Test
public void testSomethingElse(){
implicitObject.doSomethingElse();
}
}

您认为这是一个备受推崇的模式吗?有没有最佳选择?

最佳答案

保护 field

暴露父类成员通常不是一个好主意,除非该字段被声明为final(这通常是不可能的),否则它可能会被损坏或hidden由 child 类。最好通过 getter 方法来保护它。虽然它确实使implicitObject更加“可见”,但它受到了保护,免受“恶意”子类的侵害。

public class MyClass{
@Autowired
private Object implicitObject;

public final Object implicitObject() {return implicitObject;}
}

public class MySubClass extends MyClass{
public void doSomething(){
implicitObject().doSomething();
}
}

这是好的做法吗?

是的,但这取决于implicitObject背后的内容,如果它是某种上下文或资源,那么API对我来说听起来不错。

<小时/>

通过访客界面控制访问

如果您想添加更多“约束”,还有另一种解决方案:将隐式对象公开为方法参数,这会为您的隐式对象添加更多“可见性”,但涉及更多样板代码。 (受到访客模式的启发)

/**
* Class to implement for custom tests
* Enable access to low-level implicitObject
*/
public interface CustomTest {
void test(Object implicitObject);
}
public class MyClass{

@Autowired
private Object implicitObject;

@Test
public void commonTest(){
implicitObject.doSomethingBasic();
}

/**
* method that accept the visitor and give access to implicitObject
*/
public final void customTest(CustomTest customTest) {
// You can prepare some stuff before
customTest.test(implicitObject);
// You can cleanup after
}
}

CustomTest 是访问隐式对象的唯一方法:

public class MyCustomTest implements CustomTest {
@Override
public void test(Object implicitObject) {
implicitObject.doSpecificThing();
}
}

然后使用您的访问者实现。

public class MySubClass extends MyClass{
@Test
public void testSomethingElse(){
super.customTest(new MyCustomTest());
}
}

这很冗长......值得付出努力吗?同样,这取决于隐式对象背后的内容。

<小时/>

使用您的容器

我不知道 Spring 是否可能/实用,但某些容器应该能够注入(inject)隐式对象作为方法参数。

public abstract class MyClass{
@Autowired
Object implicitObject;

@Test
public void commonTest(){
implicitObject.doSomethingBasic();
}
}

public class MySubClass extends MyClass{
@Test
@Autowired
public void testSomethingElse(Object injectedImplicitObject) {
injectedImplicitObject.doSomethingElse();
}
}

关于java - Java中的隐式(继承对象),更适合的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26626291/

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