【发布时间】:2011-10-10 04:37:47
【问题描述】:
- 在类的情况下:
如果我们使用工厂方法,我们必须将创建的实现作为实现接口的类型返回。
public class Factory {
public Product getProduct() {
return new ProductA();
}
}
public interface Product {
}
class ProductA implements Product {
}
为了避免客户将返回的 Product 转换为 Product{A, B, C... etc.} 的具体实现,我们必须:
- 分别打包客户和工厂的代码(比如说
com.example.client和com.example.factory) - 声明具有默认(“包”)访问权限的具体实现(工厂可见,客户端不可见)
package com.example.client;
...
public class Client {
public static void main(String[] args) {
Product i = new Factory().getProduct();
ProductA a = (ProductA) i; // the type of ProductA isn't visible.
}
}
- 在方法的情况下:
例如我们需要使用与隐藏方法相同的工厂
public class Factory {
public Product getProduct() {
return new ProductA();
}
Product[] getCreatedProducts() {
...
}
}
我在这里看到两个问题:
- 错误的包结构:隐藏的类和方法必须与调用代码在一个包中。
- 糟糕的代码:不太直观和易于理解。将 java 文件替换为另一个包很容易中断。
【问题讨论】:
-
我以为和
protected一样,但我不确定。我总是定义一个访问关键字。 -
@Martijn
protected可以被包和子类访问。包可以访问默认值(无关键字),但子类不能访问。 -
@Aghasted 我认为你在做正确的事。但是我不明白你的“两个问题”。另外我不太清楚你为什么这样做:你为什么要对客户端隐藏不同的
Product类型? -
@toto 客户的类必须不知道他们使用的产品的实现。排除 ClassCastException 需要避免客户端的强制转换。没关系,上面的例子是虚构的。它不处理我的真实代码,但它是相似的。假设这只是用例。上面提到的这种代码组织的问题是我们不能在包之间共享 Product 的实现。例如,我们在另一个包(比如说 com.example.manager)中有一个类,它想知道客户正在使用的产品的具体类型是什么。
-
@Aghasted 哦...您希望某些包可以访问各种
Products,但其他包则不能。我不确定是否有一些安全机制可以做到这一点。
标签: java oop access-modifiers