【问题标题】:Suppressing Method Return in Object Oriented Language抑制面向对象语言中的方法返回
【发布时间】:2012-06-01 15:51:42
【问题描述】:

我首先要说这绝不是一个大问题,更多的是我在编程语言设计方面没有真正听说过的话题,我想知道是否有人有任何有趣的解决方案.

问题的关键是这个。有时在面向对象的语言中,我希望能够通过其中一种方法修改对象,但返回对象本身而不是该方法返回的内容。

举个java例子:

class MyClass{
    public MyClass(List<Integer> list){
        //do constructor stuff
    }

    public MyClass(Integer i){
        //what I would like to be able to do
        this((new LinkedList<Integer>).add(i));
    }
}

我无法在第二个构造函数中创建临时列表,因为 this() 必须是第一行。显然有很多方法可以通过改变实现来做到这一点,比如创建一个返回对象的 add() 方法,让构造对象的函数负责创建列表等。

但是,考虑到很多时候您不能/不想修改或创建子类(对于 LinkedList),并且您可能不想混淆调用代码,能够修改和返回一个对象++x 的风格可能非常有用。就像是 this(#(new LinkedList).add(i) 表示您要反对,而不是方法返回。有谁知道允许这是一些简洁的句法方式的语言?如果没有,这会有用吗?还是我在这里遗漏了一些基本的东西?

【问题讨论】:

  • 就您实际想要实现的目标而言,您的问题有点难以理解。
  • @AndrasK 有任何答案可以接受吗?
  • 我想要实现的关键是通过匿名对象的方法来修改匿名对象。可以通过让类的所有方法返回自己来做到这一点,但这并不是真正的“干净”

标签: oop syntax constructor syntactic-sugar


【解决方案1】:

这不行吗?

public class MyClass{
    public MyClass(List<Integer> list){
        //do constructor stuff
    }

    public static MyClass create(Integer i) {
        List<Integer> list = new new LinkedList<Integer>();
        list.add(i);
        MyClass myClass = new MyClass(list);
        return myClass;
    }
}

这是一种常见的设计模式,称为Factory Pattern

【讨论】:

    【解决方案2】:

    我认为解决这个问题的最简洁的方法是从构造函数中调用一个初始化方法。

    类 MyClass { 公共MyClass(列表列表){ 初始化(列表); }

    public MyClass(Integer i){
        LinkedList<Integer> list = new LinkedList<Integer>();
        list.add(i);
        init(list);
    }
    
    protected init(List<Integer> list)
    {
        // do init stuff here
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 2011-08-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多