代码之家  ›  专栏  ›  技术社区  ›  Vojislav Stojkovic

Java中属性语法的缺省

  •  5
  • Vojislav Stojkovic  · 技术社区  · 16 年前

    C具有声明和使用属性的语法。例如,可以声明一个简单的属性,如下所示:

    public int Size { get; set; }
    

    您还可以在属性中添加一些逻辑,如:

    public string SizeHex
    {
        get
        {
            return String.Format("{0:X}", Size);
        }
        set
        {
            Size = int.Parse(value, NumberStyles.HexNumber);
        }
    }
    

    无论是否具有逻辑,属性的使用方式与字段相同:

    int fileSize = myFile.Size;
    

    我对Java和C都不陌生——我使用过很多,而且我一直怀念Java中的属性语法。我读过 this question “在Java 7或也许永远不会增加财产支持的可能性很小”,但坦率地说,我发现在讨论、论坛、博客、评论和JSRs中挖掘太多的工作来找出原因。

    所以我的问题是:有人可以总结为什么Java不可能得到属性语法吗?

    • 是因为与其他可能的改进相比,它被认为不够重要吗?
    • 是否存在技术(如JVM相关)限制?
    • 这是政治问题吗?(例如) “我已经用Java编码了50年,我说我们不需要SunEnKin属性!” )
    • 这是一个案例吗? bikeshedding ?
    12 回复  |  直到 10 年前
        1
  •  13
  •   dsimcha    16 年前

    我认为这只是Java对事物的一般哲学。属性有点“神奇”,Java的理念是保持核心语言尽可能简单,避免像瘟疫一样的魔法。这使Java成为一个 弗兰卡语 几乎任何程序员都能理解。它还可以很容易地解释任意隔离的代码段在做什么,并支持更好的工具。缺点是它使语言更冗长,表达能力也更低。这不一定是设计语言的正确方法或错误方法,这只是一种权衡。

        2
  •  9
  •   krosenvold    16 年前

    在大约10年的时间里,Sun尽可能地抵制语言的任何重大变化。在同一时期,C经历了一次引人入胜的开发,每次发布都添加了许多新的酷特性。

    我认为火车在很久以前就离开了Java中的属性,它们本来是不错的,但是我们有JavaBean规范。现在添加属性只会使语言更加混乱。虽然JavaBean规范IMO远不如它好,但它必须做到。在更宏伟的计划中,我认为财产并没有那么重要。Java代码中的臃肿是由其他东西引起的,而不是吸气剂和定位器。

    还有很多更重要的事情需要关注,例如获得一个体面的关闭标准。

        3
  •  7
  •   Jim Puls    16 年前

    C中的属性语法仅限于 syntactic sugar . 你不需要它,它只是为了方便。爪哇人不喜欢句法糖。这似乎是它缺席的充分理由。

        4
  •  3
  •   Steve B.    16 年前

    可能的论点只基于我未经证实的观点

    • C中的属性语法很难看 把它和 实现模式 语言语法
    • 这不是真正必要的,因为它相当微不足道。
    • 它会对任何基于代码行付费的人产生不利影响。

    实际上,我希望对属性有某种语法上的优势,因为整个语法往往会使概念上极其简单的代码变得混乱。鲁比似乎一点也不大惊小怪。

    顺便说一句,我实际上试图编写一些没有属性访问的中型系统(几十个类),仅仅是因为混乱和代码库的大小减少了。除了不安全的设计问题(在这种情况下,我愿意捏造),几乎不可能,因为Java的每一个框架、每一个库、每一件东西都是通过get和set方法来发现属性的。它们和我们一直在一起,直到时间的尽头,有点像小的语法训练轮。

        5
  •  1
  •   duffymo    16 年前

    添加到Java可能是有用的,但它可能不像列表那样高。

    就我个人而言,我发现一个合适的IDE使这成为一个没有意义的观点。Intellij可以为我生成所有getter/setter;我所要做的就是将您所做的行为嵌入到方法中。我不认为这会破坏交易。

    我承认我对C不了解,所以也许那些人会推翻我。这只是我的意见。

        6
  •  1
  •   Rob Di Marco    16 年前

    我想说它反映了语言变化的缓慢。正如之前的评论所提到的,现在大多数IDE都没有那么大的影响。但是,没有任何JVM不存在的具体原因。

        7
  •  1
  •   Kris Pruden    16 年前

    如果我不得不猜测的话,我会说这与哲学上反对句法糖(它们添加了自动氧化,增强了循环,静态导入等等——所有的糖)没有多大关系,而与向后兼容的问题有关。至少到目前为止,Java用户已经非常努力地设计新的语言特征,这样就可以保存源级向后兼容性(即,为1.4编写的代码仍然可以编译,并且在5或6或更高的范围内没有修改)。

    假设它们引入了属性语法。那么,以下是什么意思?

    myObj.attr = 5;
    

    这取决于您所说的代码是在添加属性特性之前还是之后编写的,可能还取决于类本身的定义。

    我并不是说这些问题无法解决,但我怀疑这些问题能否以一种干净、明确的语法解决,同时保持源代码与以前版本的兼容性。

    Python的人也许能够破除旧代码,但这不是Java的方式…

        8
  •  0
  •   Ray Hidayat    16 年前

    同样的原因是,它们不改变Java向后兼容性中的任何其他内容。

        9
  •  0
  •   OscarRyz    16 年前

    -是因为与其他可能的改进相比,它被认为不够重要吗?

    这是我的猜测。

    -是否存在技术(如JVM相关)限制?

    -这是政治问题吗?(例如,我已经用Java编码了50年,我说:我们不需要史蒂芬金的属性!”

    极有可能。

    -是骑自行车吗?

    休斯敦大学?

    Java的主要目标之一是保持语言简单。

    从: Wikipedia

    Java为了简化语言和防止可能的错误和反模式设计而抑制了几个特性(…)。

        10
  •  0
  •   Bill K    16 年前

    这里有一些逻辑,对我来说,导致不喜欢语言中的属性:

    有些编程结构之所以被使用是因为它们存在,即使它们支持糟糕的编程实践。

    setter表示可变对象。稀疏使用的东西。

    好的OO设计要求对象执行一些业务逻辑。属性意味着您在向它请求数据并自己操作数据。

    尽管可以重写setter和getter中的方法,但很少有人这样做;最后一个公共变量与getter完全相同。所以,如果你没有可变的物体,这是一个不确定的点。

    如果变量具有与之相关联的业务逻辑,那么逻辑通常应该在具有该变量的类中。如果没有,为什么它在世界上是一个变量????它应该是“数据”,并且在一个数据结构中,这样它就可以被通用代码操纵。


    我相信乔恩·斯基特指出,C有一种处理这种数据的新方法,这种数据应该是编译时类型的,但实际上不应该是变量,但是由于我的世界与C世界的交互非常少,所以我相信他的话,这很酷。

    另外,我完全接受,根据您的风格和与之交互的代码,您只需要不时地有一个设置/获取情况。我仍然平均每一两个类有一个setter/getter,但不足以让我觉得新的编程结构是合理的。

    请注意,我对工作和家庭编程有非常不同的要求。对于我的代码必须与其他20个人的代码交互的工作,我认为越结构化和明确,越好。在家里,groovy/ruby很好,属性也很好,等等。

        11
  •  0
  •   DaedalusUsedPerl    13 年前

    根据核心Java的第2卷(忘记了作者,但它是一本非常受欢迎的书),语言设计者认为在字段访问语法后面隐藏一个方法调用是一个糟糕的想法,所以把它排除在外。

        12
  •  0
  •   LEMUEL ADANE    10 年前

    您可能不需要“get”和“set”前缀,为了使其看起来更像属性,您可以这样做:

    public class Person {
        private String firstName = "";
        private Integer age = 0;
    
        public String firstName() { return firstName; } // getter
        public void firstName(String val) { firstName = val; } // setter
    
        public Integer age() { return age; } // getter
        public void age(Integer val) { age = val; } //setter
    
        public static void main(String[] args) {
            Person p = new Person();
    
            //set
            p.firstName("Lemuel");
            p.age(40);
    
            //get
            System.out.println(String.format("I'm %s, %d yearsold",
                p.firstName(),
                p.age());
        }
    }