【问题标题】:I want more syntactic sugar in my Java! [closed]我想要在我的 Java 中有更多的语法糖! [关闭]
【发布时间】:2010-09-27 18:14:06
【问题描述】:

属性的语法糖,例如在 C# 中:

private int x;

public int X{
    get { return x; }
    set { x = value; }
}

或者干脆

 public int X{ get; set; }

我在 java 中缺少逐字字符串...@"C:\My Documents\" 而不是 "C:\\My Documents\\"

你同意 Java 需要更多的“糖”吗?有谁知道下一个 Java 版本中会出现糖吗?

【问题讨论】:

  • 询问语言方向的信息不是争论,也不是主观的。帖子的部分内容是主观的,但不是全部。重新打开。
  • 我同意 Java 需要向前发展,不仅是语法糖,还有新的概念。如今,用当前的 C# 编写代码比使用当前的 Java 编写代码更有趣。
  • 其实贴出来的代码是行不通的。您需要摆脱私有字段(3.0 风格)或显式放入 return 和 assignment。
  • @chris: 如果你使用会发生什么: public int X{ get; ??我的猜测是以下内容无法编译:object.x = 1; ?
  • 恕我直言,这不是一个真正的问题。

标签: java syntactic-sugar


【解决方案1】:

“语法糖会导致分号癌。”

——艾伦·佩利斯。编程警句。

【讨论】:

  • 有趣但不是真正的答案。我应该对此投反对票吗?... mmhhh 我很受诱惑... mmmmhh... Naahh 我想我会节省 1+ 的代表:P
  • 谢谢!回复:“真正的答案”,其他人已经很好地回答了这个问题。
【解决方案2】:

听起来像你想要的 Groovy... 显然属性正在开发中,虽然不在 Java 7 中(正如 @erickson 在评论中帮助我纠正的那样)。

Groovy 确实有 nice string sugar

【讨论】:

  • 是的! Java 应该集成一些 Groovy 的特性。
  • Remi Forax 和其他人正在研究属性,但这对于 Java 7 来说绝对不是一个完成的交易。不过,JavaFX 属性应该可以帮助他们。
  • 我不肯定他们出局了,但我认为他们不太可能。 Joe Darcy 正在领导为 Java 7 收集“小”语言更改的工作,这意味着没有足够的时间来解决“大”更改。查看 Alex Miller 的 Java 7 语言交换所:tech.puredanger.com/java7
  • 同意。 Groovy 对此有好处,还有更多。
【解决方案3】:

虽然我不一定同意 Java 的哲学,但我认为向 Java 添加大量 语法糖 会违背其哲学。 Java 应该是一种非常简单、易于推理且结构很少的语言,是编程社区中最低的通用语言lingua franca。这主要是对 C++ 复杂性的一种反应。除了使其成为一种内存安全语言所需的(主要是垃圾收集)之外,它应该没有什么“魔法”。

如果您想在一种相当高性能的静态类型语言中获得更多糖等,我会说 Java 对您来说是错误的语言。最好只使用 C# 或 D。

【讨论】:

  • “Java 应该是一个非常简单的东西”,同意,但是 Java 中有些东西可能会变得混乱......为什么不添加“糖”让事情变得更有趣?
  • 因为一旦添加了更多的糖,就会出现意外的复杂性 =)
  • 或者使用 Scala 或 Kotlin 来获得许多简洁的语法,因为它们也在 JVM 上运行并与 Java 互操作。
【解决方案4】:

在过去的几年里,我还使用 Java 和 C# 进行了开发,并发现 C# 在表达能力和强大的语言结构方面是一种优越的语言。 Java 语言的变化和更新程度与 C# 不同,至少速度不同。我仍然不一定意味着 Java 应该大幅更新,但我们需要在 Java 平台上提供一种强大且富有表现力的静态类型语言。我认为 Scala 会发展成为这种替代语言,我们 Java 开发人员可以在普通 Java 不削减它的情况下切换到它。

C# 是一门绝妙的语言;可能是当今“最好的”静态类型语言,但在我看来,Java 仍然是一个优越的平台。我喜欢 Java 这个平台,我喜欢 C# 这个语言。

【讨论】:

  • +1 因为:我喜欢 Java 这个平台,我喜欢 C# 这个语言。
  • +1 提到 Scala
【解决方案5】:

根据 Mark Reinhold 在 Devoxx 2008 上的演讲,Java 7 中不会向 Java 添加属性支持。

http://hamletdarcy.blogspot.com/2008/12/java-7-update-from-mark-reinhold-at.html

在此处了解有关 Java 7 想法中属性的更多信息:

http://tech.puredanger.com/java7#property

【讨论】:

    【解决方案6】:

    虽然属性很好,但它们不是 java。我真的认为 javabean 规范很久以前就关上了那扇门。我认为需要更清晰的语法糖案例:

    • 由于缺少委托/闭包而使用内部类。当前语法来自地狱。
    • 方法作为一阶语言结构,即方法数据类型。
    • 使用泛型进行类型推断
    • 在反射 API 中运行时存在泛型。
    • 活动

    【讨论】:

      【解决方案7】:

      如果我再次将 java 用于任何大型项目,它将作为另一个编译器的输出语言。

      【讨论】:

        【解决方案8】:

        那是老式的 C#。现在是

        public int X { get; set; }
        

        【讨论】:

        • 抱歉,有一段时间我不会用 C# 编写代码。这只是我在学校里怀念的两件事,因为微软实际上将 Java 从所有学校课程中踢了出去......但无论如何,这是一个不同的故事......
        • 微软在大学课程中甚至还没有接近等同于 Java。我知道真正使用 C# 的主要大学很少。
        • 不诚实使用C#的各大大学怎么办? :)
        • 在葡萄牙,所有主要大学都知道与微软有着密切的联系......
        • 阅读的不是“旧时代@学校”而是“C# 旧学校”(第一个 C# 程序员)。反正我不太明白。如果 X 是公开的,那么 get/set 就已经存在了……为什么不直接使用它: public int X;并调用 object.x = 1; int a = object.x;
        【解决方案9】:

        糖对牙齿有害。语法糖对你的大脑有害。

        【讨论】:

        • 但对我的眼睛和...手指来说很甜蜜...
        • 听听听听。永远的汇编语言。
        • 不,很好。例如,自动属性意味着在阅读代码时,您一次可以在屏幕上看到更多内容,而您的大脑花费更少的时间进行日常解析,而将更多时间用于评估代码的含义。
        • “句法糖”可以增强语言的简洁性(tersitude?tersosity?),这反过来对你的大脑来说实际上是一件好事。
        • “语法糖会导致分号癌”——艾伦·佩利斯
        【解决方案10】:

        这不是完全必要的。

        一个简单的编辑器宏就可以工作:

        prop int x -->

        private int x;
        
        public int getX(){
           return x;
        }
        public void setX(int val){ 
           x = val;
        }
        

        编辑:(回应cmets)

        这怎么比不上:

        private int x;
        
        public int X{
            get { return x; }
            set { x = value; }
        }
        

        【讨论】:

        • 是的,就写作而言是真的……就阅读而言……我不太确定……
        • 同意。代码的阅读次数比编写次数多。
        • 在你的第一个例子中,属性是用两个单独的方法编写的,在第二个例子中,只有一个构造,即属性,由一个 setter 和一个 getter 组成。就像马特布里格斯指出的那样,第二个可以用更简化的阅读方式编写。
        • 为什么不直接公开属性?这更易读、更简单(也更糟糕) public int x; // 就是这样!
        • 公共字段导致实现泄漏。
        【解决方案11】:

        我已经写了一些注释(和一个注释处理器)来帮助这点。

        http://code.google.com/p/javadude/wiki/Annotations

        例如:

        @Bean(
            properties={
                @Property(name="name", bound=true), // String is default type
                @Property(name="age", type=int.class, bound=true)
            }
        )
        public class Foo extends FooGen {}
        

        这会生成包含字段和 get/set 方法的 FooGen,并绑定它们(这是可选的)。您还可以使用这些来做许多其他有趣的事情。

        注意:我现在正在做一些调整,以弃用各种“覆盖”选项。

        享受,

        -- 斯科特

        【讨论】:

          【解决方案12】:

          Java 非常适合实现的一件事是等效于 refout 参数。

          【讨论】:

            【解决方案13】:

            我不喜欢“语法糖”,主要是因为它是另一回事,而且很可能最终会被滥用。我诅咒自己制作 getter 和 setter 的烦恼,所以我理解为什么要尽可能简单地创建它们,但我宁愿看到 @Get@Set@GetSet 注释而不是更多语法 thingamajiggers完成这项工作。

            【讨论】:

            • 在我看来是个好主意,Get/Setter 注释可以解决问题...只要它可以让您在不破坏对象接口的情况下更改 getter 或 setter 行为。
            • 这不是“要学习的另一件事”,因为无论如何您都必须学习“setVar”/“getVar”模式。
            【解决方案14】:

            java平台采用了大量的编程语言。如果您想要更多的语法糖,您可以使用另一种语言,如 Groovy 或 (J)Ruby,它仍将在 jvm 上运行并与您的其他 java 库一起使用。 (我什至认为有一个 C# 实现;)

            【讨论】:

              【解决方案15】:

              与许多人一样,我坚持管理用 Java 1.4 编写的应用程序(迁移到 1.5 是许多情况下的一种方式)。所以即使 Java 7 或 8 有新的特性我也用不上……反正语法糖很好,它可以帮助编写、阅读和分析代码。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-01-03
                • 2022-01-21
                • 1970-01-01
                • 2011-10-02
                • 1970-01-01
                相关资源
                最近更新 更多