首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >面向对象设计:静态字段

面向对象设计:静态字段
EN

Stack Overflow用户
提问于 2013-01-20 17:56:24
回答 3查看 150关注 0票数 2

目前,我声明我的所有静态字段如下:

代码语言:javascript
复制
public static final int EXAMPLE_OF_STATIC_FIELD = 0;

假设我有一个基类,它的字段代表了类内可能锁定的所有错误:

代码语言:javascript
复制
public class Base {

    public static final int ERROR_1 = 0;
    public static final int ERROR_2 = 1;
    public static final int ERROR_3 = 2;

}

如果我扩展这个基类并希望向类中添加更多的Error types,我将执行以下操作:

代码语言:javascript
复制
public class OffSpring extends Base {

        public static final int NEW_ERROR_1 = 3;

    }

要声明新的Error types,我需要从基类中知道Error types的值,在我看来,这不太方便,因为我可能会意外地在Base class的子类中声明Error Type,其值与Base class中的Error type相同。例如:

代码语言:javascript
复制
public static final int NEW_ERROR_1 = 0;

这将与

代码语言:javascript
复制
public static final int ERROR_1 = 0;

会有冲突..。

我想也许使用一个Enum Class,但是事实证明你不能扩展它。Can enums be subclassed to add new elements?

另一种选择是对所有静态字段使用字符串值类型而不是int值类型,但这不是一个非常有效的解决方案.

我如何在一个类的后代中添加更多的字段,而不与超类冲突呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-20 18:06:27

我会怀疑你是否真的想这么做。如果常量对它们的声明类是私有的,那么如果它们重用相同的值又有什么关系呢?如果在某个上下文中,不同的错误不使用相同的值是很重要的,那么这就强烈地表明,它们实际上不应该是私有的。

如果你真的想这样做,你可以这样做:

代码语言:javascript
复制
public class Base {
    private static final int ERROR_1 = 0;
    private static final int ERROR_2 = 1;
    private static final int ERROR_3 = 2;
    protected static final int LAST_ERROR = ERROR_3;
}

public class OffSpring extends Base {
    private static final int NEW_ERROR_1 = Base.LAST_ERROR + 1;
}

但是,如果您想拥有Base的多个子类(每个子类都定义自己的错误代码),那么您就有麻烦了。

票数 3
EN

Stack Overflow用户

发布于 2013-01-20 18:05:38

我看不出您的问题,因为private static final不是继承的属性。您将无法访问不存在的OffSpring.ERROR_1。因此,如果您想使用错误,您可以选择使用枚举并以正确的方式使用它们。如果你做了前置整数,那是因为你想要使用像错误组合这样的哈克,所以你不能使用值3

我把错误组合称为什么?如果您的脚本因两个错误而失败,ERROR_1和Error_2 (如果ERROR_1为1,而ERROR_2为2),如果您说您在代码3中有一个错误,您说您获得了ERROR_1和ERROR_2,因为1是二进制代码,编码为01,2是它们的组合。

如果要对所有自定义错误进行唯一标识,请使用GUID生成器,例如

代码语言:javascript
复制
public class GUIDGenerator{
    private int id = 1;
    public int getId(){
          return id++; 
    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-01-20 18:05:36

为什么不将错误类型存储在地图中,这样就可以检查错误类型是否声明了,因为这正是您想要做的。

有一个Map<String, int> error_types。当您继续添加更多时,您可以在基类上进行检查并避免冲突。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14427433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档