【问题标题】:Java how to add items directly to a class rather than having an array objectJava如何将项目直接添加到类而不是数组对象
【发布时间】:2020-06-26 17:32:16
【问题描述】:

我有一个Array 作为类的一部分,可以向其中添加项目,但我想直接将项目添加到类本身。这可能吗?

public class Buttons {
    public Array<SimpleButton> buttons = new Array<SimpleButton>();
}

然后我可以添加这样的项目:

buttons.buttons.add(simpButton);

但我想像这样直接添加项目:

buttons.add(simpButton);

【问题讨论】:

    标签: java arrays class


    【解决方案1】:

    您可以向您的类添加一个“添加”功能并通过类对象使用它

    public class Buttons {
    public Array<SimpleButton> buttons = new Array<SimpleButton>();
    
    public void add(SimpleButton input){
          //Handle invalid input
          buttons.add(input);
    }
    }
    

    所以要使用它,你会做一些类似的事情 -

    Buttons buttonObj = new Buttons();
    buttonObj.add(SimpleButtonTmp); //SimpleButtonTmp -> SimpleButton Obj
    

    否则,如果您不想走这条路,您可以执行以下操作 -

    public class Buttons extends Array<SimpleButton>
    

    然后就可以直接访问所有功能了

    public static void main(String[] args)
    {
    Buttons myButton = new Buttons();
    myButton.*AnyfunctionInArray();
    }
    

    【讨论】:

    • 好的,这是一个有趣的解决方法,但是该数组仍然无法以任何其他方式以buttons 访问,它仍然必须以buttons.buttons 访问,例如buttons.buttons.size。跨度>
    • 你可以创建任何你需要的函数来阻止buttons.buttons访问。
    • 我不明白你的意思。我能看到的唯一方法是为每个数组方法创建一个函数,这显然是不切实际的。
    • @Hasen 您可以使用Buttons extends Array,而不是将Array 作为字段成员。我不会推荐这种方法,但它会给出你正在寻找的结果。 RR_IL 建议的正确处理方式是:定义您需要的方法,然后实现逻辑或将逻辑委托给字段成员。
    • @Hasen 如果您决定稍后将您的实现从 Array 更改为 ListSet(可能是出于性能原因,甚至是为了修复错误),您将需要更改公共接口,这可能会破坏依赖于先前公共接口的现有代码。 Glains 的回答通过隐藏底层实现和暴露接口而不是具体实现来避免这个问题。但是,他的答案使用了List,因此只有在Array implements List 时才有效。
    【解决方案2】:

    如果您确定您的班级基本上充当List,您可以使用来自 Guava 的ForwardingList。顾名思义,它将所有调用转发到获得的delegate() 实例。这样,您不必自己实现所有方法,而只能覆盖特定方法。

    public class ButtonList extends ForwardingList<SimpleButton> {
    
        private final List<SimpleButton> delegate = new ArrayList<>();
    
        @Override 
        protected List<SimpleButton> delegate() {
            return delegate;
        }
    
    }
    

    由于呼叫是默认转发的,因此您可以调用任何常规的List 方法。

    ButtonList list = new ButtonList();
    list.add(new SimpleButton());
    int size = list.size(); // 1
    

    但是,如果您的类不作为 List,我建议您自己创建所需的委托方法。这将隐藏实现并使未来的更改更容易。当然,这可能有点麻烦,但现代 IDE 已经为您支持创建委托方法。

    参考资料:

    【讨论】:

    • 有趣。这会比扩展ArrayArrayList 更好或不同吗?
    • 最后,这不仅仅与灵活性有关。如果您确定它将保持为List,请选择ForwardingList,您可以稍后更改实际实现(ArrayListLinkedList、...)无需修改所有其他参考,因为您只使用Listinterface。如果您想要更大的灵活性,请选择ForwardingCollection
    【解决方案3】:

    您可以使用 ArrayList 并扩展所有 ArrayList 方法示例:

    import java.util.ArrayList;
    
    public class Buttons extends ArrayList{
        public  ArrayList<String> buttons = new ArrayList<String>();
    
    }
    

    主类:

    public class Main{
        public static void main(String[] args) {
            Buttons buttons = new Buttons();
            buttons.add("button 1");
    
            int i=0;
            while(i < buttons.size())
            {
                System.out.println(buttons.get(i));
                i++;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 2011-07-01
      • 2022-01-20
      • 2016-08-16
      • 2014-08-02
      • 1970-01-01
      相关资源
      最近更新 更多