接口中的Java静态方法/字段(再次!)

时间:2013-07-27 13:46:45

标签: java interface static override

我的问题是:

  • 我有很多不同的类都扩展了基类(Identifiable)。
  • 我需要为子类的某些分配一个特定值(securityLevel),该值应该是可更改的并分配给该类的所有成员(即:它应该是{ {1}})。
  • 我需要通过共同的祖先访问这些类。
  • 我该怎么做?

首先想到的是让一个专用的staticinterface)定义值或静态方法来访问它们,让实际的类不要{{1}它,如果有的话,覆盖ISecurity字段(或检索它的方法)。 然而,由于两个原因,这是不可能的:

  1. 当前的Java语言不允许implements中的static成员。
  2. 即使允许它,也不可能static它。
  3. 我如何解决问题? 我发现的唯一方法是:

    • 向基类添加非interface成员(@Override)以检索返回static的值。
    • 在感兴趣的类public Class getValueProvider()中,非null方法返回实现所需值的@Override实现setter和getter的值。
    • 使用检索到的static实例获取请求的值(如果返回值为null,则跳过所有内容)。

    这非常难看,并且没有办法在子类中强制执行正确的实现。

3 个答案:

答案 0 :(得分:0)

您可以将Identifiable定义为abstract class。此外,您可以定义另一个扩展abstract class的{​​{1}}并遵守您的限制,即保留Identifiable以及可能需要的任何方法。

答案 1 :(得分:0)

我会尽量避免任何静态成员。 java中的静态成员总是很吵(你不能覆盖只是隐藏它们等等)

我不确定我是否理解您的问题,但我建议您使用上下文界面或其他东西构建对象。然后,如果对象允许返回值或必须返回特殊值,则对象可以访问这些上下文接口。

创建所有这些对象的对象可以传递相同的对象,从而控制行为。然后,该对象可以保持静态(如singelton)

答案 2 :(得分:0)

您可以尝试服务/工厂类型的实施。或者使用某种类对象来存储安全性(SecuritySettings)并在当前Identifiable对象中发送以获得安全级别

    public class Identifiable { }
    public class SampleUser extends Identifiable { }
    public class ExampleUser extends Identifiable { }

    public class UserService
    {
        public int SampleUserSecurity = 0;
        //Or an array/dictionary structure

        public int GetSecurityLevel(Identifiable user)
        {
            if(user instanceof SampleUser)
            {
                return SampleUserSecurity;
            }
        }

        public SampleUser CreateSampleUser()
        {
            return new SampleUser();
        }

        public ExampleUser CreateExampleUser()
        {
            return new ExampleUser();
        }
    }