在Java中,有没有关于何时使用每个访问修饰符,即默认明确的规则(包私有)public,protected并且private,同时使class与interface和处理继承?
反对在接口上声明受保护访问成员的论点是什么?例如,这是无效的:
public interface IOrange
{
public OrangePeel Peel { get; }
protected OrangePips Seeds { get; }
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,接口IOrange将保证实现者至少OrangePips向其继承者提供实例.如果实现者想要,他们可以扩大范围public:
public class NavelOrange : IOrange
{
public OrangePeel Peel { get { return new OrangePeel(); } }
protected OrangePips Seeds { get { return null; } }
}
public class ValenciaOrange : IOrange
{
public OrangePeel Peel { get { return new OrangePeel(); } }
public OrangePips Seeds { get { return new OrangePips(6); …Run Code Online (Sandbox Code Playgroud) 我的班级应该同时扩展两个班级:
public class Preferences extends AbstractBillingActivity {
public class Preferences extends PreferenceActivity {
Run Code Online (Sandbox Code Playgroud)
怎么办?
更新.由于这是不可能的,那么我应该如何将这个AbstractBillingActivity与Preferences一起使用呢?
Upd2.如果我使用接口,我应该创建:
BillingInterface
public interface BillingInterface extends PreferenceActivity, AbstractBillingActivity {
}
Run Code Online (Sandbox Code Playgroud)PreferenceActivity
public interface PreferenceActivity {
}
Run Code Online (Sandbox Code Playgroud)AbstractBillingActivity
public interface AbstractBillingActivity {
void onCreate(Bundle savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud)然后
public class Preferences implements BillingInterface {
Run Code Online (Sandbox Code Playgroud) 当我实现一个interface方法时,我不得不把它变成一个public方法.
我们可能会default遇到我们想要使用的情况(如同在相同包中访问的情况)或protected.
有人可以解释这个限制背后的原因吗?
它说,在Java教程"定义接口"中
如果未指定接口
public,则只能在与接口相同的包中定义的类上访问您的接口.
但是,这个
interface PPInterface {
void foo();
void bar();
}
class NewClass implements PPInterface {
void foo() {}
void bar() {}
}
Run Code Online (Sandbox Code Playgroud)
生成编译器错误NewClass因为我'试图分配较弱的访问权限; 是公开的.所以文档是错误的,或者我做错了什么,或者我误解了文档?
我想我不必使用界面 - 我喜欢它,因为它保持了良好的组织.
我知道界面必须是公开的.但是,我不希望这样.
我希望我的实现方法只能从他们自己的包中访问,所以我希望我的实现方法受到保护.
问题是我无法使接口或实现的方法受到保护.
什么是解决方法?是否存在与此问题相关的设计模式?
从Java指南中,抽象类也不能完成这项工作.
可能重复:
在接口中受保护
在Java中为什么我不能在接口中使用受保护的方法?
因为根据Java规范
受保护的访问(由关键字protected表示) - 同一个包中任何类型可访问的字段或方法,以及任何包中的子类.
如果我必须使用该接口,我将实现它并覆盖方法.因此,如果我要实现类可以访问这些方法的位置,那么可以在任何包中访问该方法.那么在接口中将方法声明为受保护的危害是什么呢?
我想将组件的接口公开为接口,并且实现类将受到包保护(并且可能在其他一些包中):
package baz.iface
interface Foo {
void bar();
}
package baz.whatever
@Component
class SpringyFoo implements baz.iface.Foo {
public void bar() { frobnicate(); }
}
Run Code Online (Sandbox Code Playgroud)
假设baz.whatever在component-scan,春天能否在baz.iface.Foo其他地方自动装配?
class FooClient {
@Autowired
private baz.iface.Foo;
}
Run Code Online (Sandbox Code Playgroud) 好吧,我知道这个问题已经被问过几次了,但我需要针对我的具体情况的建议。有 Encodable 和 Decodable 之分,消息既是 Encodable 又是 Decodable:
interface Encodable { void encode(); }
interface Decodable { void decode(); }
class Message implements Encodable, Decodable { ... }
void processEncodable(Encodable encodable) {
...
encodable.encode();
...
}
Run Code Online (Sandbox Code Playgroud)
除了 Message 之外,还有其他 Encodable(和 Decodable),它们需要在 processEncodable 中进行处理。到目前为止一切顺利,但问题是我想从包外部隐藏encode()和decode(),并且Java接口不允许受保护/私有方法。有人可能会建议抽象类,但正如您所看到的,Message 应该同时继承 Encodable 和 Decodable,所以情况并非如此。有什么建议么?
这些天我非常喜欢 Scala,Scala 特征允许受保护/私有方法,恕我直言,这更直观。我已经浏览了一些提到Java接口设计理念的答案,但我真的不明白为什么如果引入接口作为多重继承的替代方案,那么它不应该允许受保护的方法,而抽象类则允许......
查看以下模型:
interface Context {
BeanFactory getBeanFactory(); // public method
void refresh(); // public method
void destroy(); // public method
}
interface BeanFactory {
<T> T getBean(String id); // public method
void destroyBeans(); // should be private method for user, but visible for Context
}
class ContextImpl implements Context {
private BeanFactory beanFactory;
@Override
public void destroy() {
beanFactory.destroyBeans();
}
}
Run Code Online (Sandbox Code Playgroud)
ContextImpl使用BeanFactory接口,这就是方法destroyBeans()放置在那里的原因。但我不希望它在那里,因为它是内部 API,应该对用户隐藏。
我想到使用内部AbstractBeanFactory受保护方法的引用。这将解决向最终用户公开方法的问题,但会用抽象类替换接口。destroyBeans()Context
另一种变体是创建另一个接口,该接口将扩展最终用户接口,并在 Context 中使用它。这将破坏用户创建自己的 BeanFactory 实现的能力。
我想知道是否有一个众所周知的解决方案来解决该问题,或者只是看看其他替代方案。
可能重复:
在接口中受保护
以下代码片段显示Java中的接口只能有一个公共修饰符.在接口中不允许使用其他修饰符(私有和受保护的),既不使用字段也不允许使用任何方法.显然在修饰符中,private在接口中没有任何意义,但是应该允许在接口中使用protected,因为它可以通过它的实现类来合并.
interface Demo
{
private final static int a=10; //Will not be compiled.
protected final static int b=20; //Will not be compiled.
public final static int x=0; //ok
abstract public void showSum();
}
Run Code Online (Sandbox Code Playgroud)
允许抽象类将所有修饰符设置为private,public和protected.我的问题是只有一个受保护的修饰符是不是多少有些似乎被允许在一个界面中允许的.为什么?