vit*_*aut 32 java access-specifier private-members public-members
如果在包含类之外仍然无法访问Java中私有内部类公共成员的原因是什么?或者可以吗?
public class DataStructure {
// ...
private class InnerEvenIterator {
// ...
public boolean hasNext() { // Why public?
// ...
}
}
}
Run Code Online (Sandbox Code Playgroud)
Gur*_*oca 32
如果InnerEvenIterator类没有扩展任何类或实现任何接口,我认为这是无稽之谈,因为没有其他类可以访问它的任何实例.
但是,如果它扩展或实现任何其他非私有类或接口,它是有道理的.一个例子:
interface EvenIterator {
public boolean hasNext();
}
public class DataStructure {
// ...
private class InnerEvenIterator implements EvenIterator{
// ...
public boolean hasNext() { // Why public?
// ...
}
}
InnerEvenIterator iterator;
public EvenIterator getIterator(){
return iterator;
}
}
Run Code Online (Sandbox Code Playgroud)
axt*_*avt 15
public尽管编译器在这种特定情况下不强制执行可见性规则,但可以使用此方法来指示它在语义上是公共的.
想象一下,在一些重构过程中,你需要让这个内部类成为顶级.如果这种方法是private,您将如何决定是否应该制作public,或者应该使用一些更严格的修饰符?声明方法public告诉读者原作者的意图 - 这种方法不应被视为实现细节.
实现任何一个都很有用interface.
class DataStructure implements Iterable<DataStructure> {
@Override
public Iterator<DataStructure> iterator() {
return new InnerEvenIterator();
}
// ...
private class InnerEvenIterator implements Iterator<DataStructure> {
// ...
public boolean hasNext() { // Why public?
// ...
return false;
}
@Override
public DataStructure next() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not supported yet.");
}
}
public static void main(String[] ex) {
DataStructure ds = new DataStructure();
Iterator<DataStructure> ids = ds.iterator();
ids.hasNext(); // accessable
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25760 次 |
| 最近记录: |