java - 在 Java 中使用枚举作为类

标签 java

我有一个包含enum 的类,其中包含list 对象

public enum State {
    ACTIVE,NOT_ACTIVE;
}

public class SomeObject {
    State state;        
    public SomeObject(State state) {
        this.state = state;
    }
}    

public class SomeObjects{
    State state;
    ArrayList<SomeObject> objects = new ArrayList<Main.SomeObject>();       
    public SomeObjects(int count) {
        state = State.ACTIVE;
        for (int i = 0; i < count; i++) {
            objects.add(new SomeObject(state));
        }
    }       
    public void changeState(State state) {
        this.state = state;
    }
}

现在,如果我使用 changeState(State.NOT_ACTIVE),它会改变 SomeObjectslist 中的所有对象的状态,或者只改变一些对象?

如果仅在 SomeObjects 中,我应该如何使用 changeState()更改列表中所有对象的状态

在这种情况下,创建包含该枚举的类是唯一的方法吗?

更新:谢谢,但就我而言,我需要使用

更改所有对象的状态
this.state = state;

最佳答案

And now if I use changeState(State.NOT_ACTIVE) it will change state in SomeObjects and in all Objects in list or only in SomeObjects?

我不完全确定你的思路是什么。

如果您调用 changeState(NOT_ACTIVE)SomeObjects 的某些实例上, 然后根据方法的定义,它将设置该对象的 state字段为 NOT_ACTIVE .这个单个方法调用不可能更改多个对象,因为它对单个变量执行单个赋值。

If only in SomeObjects, what should I do to change state in all Objects in list with changeState()?

如果你想要 changeState将状态应用于 objects 中包含的所有对象的方法场,那么你可以用一个简单的循环让它做到这一点:

public void changeState(State state) {
    this.state = state;
    for (SomeObject obj : objects) {
        obj.state = state;
    }
}

Is the creating of class, containing that enum, the only way in this case?

同样,我不清楚您在这里的确切想法。你不想设置state吗?所有 SomeObject 的值(value)SomeObjects 中包含的实例实例?也就是说,为已经定义的类的已经存在的实例设置值?

如果是这样,那么这可以通过在循环中设置值来完成。该字段是一个枚举这一事实没有区别;任何原始类型或引用类型在这里的行为都是相同的。


编辑以回答评论:啊,听起来根本问题首先是使用字段。

鉴于您想要 objects 的所有内容集合始终具有完全相同的状态,它们都有一个单独的 state 可能是错误的 field 。这是一个建模错误,因为 SomeObject实例并不真正独立地持有/控制它自己的状态。

我之前要建议的是,您应该实现方法,而不是直接访问字段 - 这就是现在出现的问题。而不是 SomeObject有一个state 字段,它应该有一个 getState() 方法。对于给定的实例,您有办法获取其当前状态 - 但这不一定作为直接对象引用来实现。

这个方法的实现应该只是获取包装的状态 SomeObjects实例(这不是一个特别有用的类名)。所以它可能实现如下:

public class SomeObject {
    private final SomeObjects parent;

    public SomeObject(SomeObjects parent) {
        this.parent = parent;
    }

    public State getState() {
        return parent.state; // Ideally accessed via method too
    }
}

这与我对您的设计的理解是一致的 - 每个 SomeObject与包装状态相同 SomeObjects (因此隐含地必须始终定义一个父 SomeObjects 实例)。上面的代码几乎是该设计的精确表示。

(枚举在这里仍然没有什么特别之处;如果您返回 intStringMap<MyFoo, Set<Future<ResultSet>>,事情将以相同的方式工作。)

关于java - 在 Java 中使用枚举作为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11720166/

相关文章:

java - 在对象更改值时维护 TreeSet 排序

java - 向 Azure Graph API 发送 POST 请求时收到 400 Bad request

java - DataOutputStream 的 writeInt 不起作用

java - 如何知道 List 对象是否具有固定大小

java - 在java中读取陷入循环的文本文件

java - 如何在 Java 桌面应用程序中拥有菜单(网站样式导航链接)

java - 如何创建这样的线

c# - 如何从 Hibernate/NHibernate 中的值对象引用实体?

javascript - javascript和java的按位运算有什么不同

javascript - BigDecimal 在 GWT 编译的 JavaScript 中是如何表示的