【问题标题】:In regards to the difference between Java "Properties" and C#' Properties关于 Java“属性”和 C# 属性之间的区别
【发布时间】:2014-04-06 21:49:20
【问题描述】:

作为实习的一部分,我使用 C# 工作了六个月。我在实习中学到的东西是 C# 属性的美妙之处,也就是 setter 和 getter。实习开始的时候,属性也是我困惑的一个来源,但是用了一段时间,我就爱上了它。

回到 Java 学习课程,我不得不告别它。

直到..我开始了这个简单的任务:

我的方法和构造函数:

private double xCoor;
private double yCoor;

public Point(double xCoor, double yCoor)
{
    this.xCoor = xCoor;
    this.yCoor = yCoor;
}

public void setCoor(double xCoor, double yCoor)
{
    this.xCoor = xCoor;
    this.yCoor = yCoor;
}

public void printCoor()
{
    System.out.println("(" + xCoor + ", " + yCoor + ")");
}

为了演示,这里是我的主要方法:

    Point pointOne = new Point(6.0, 7.0);
    pointOne.printCoor();
    pointOne.setCoor(9.0, 3.0);

    pointOne.xCoor = 9.0;
    pointOne.yCoor = 7.0;

    System.out.println("Java Properties: " + pointOne.xCoor);
    System.out.println("Java Properties: " + pointOne.yCoor);

如您所知,以Point pointOne = ..; 开头的前三行是“Java”做事的方式。可以看到getter是print语句的形式,setter是.setCoor(..)的形式。

现在,我的问题是,在 Java 中(我刚学过) - 您还可以通过 pointOne.xCoor = .. 的类似属性的声明来设置私有变量,当然,也可以通过与 pointOne.xCoor 相同的方式获取它们。

我知道这种与 C# 方式的差异,因为可以手动声明属性的名称,就像这样(如果它是 C#)。

public string XCoor
{
    get { return this.xCoor; }
    set { xCoor = value; }
}

有人可以帮我理解 Java 处理属性的方式和 C# 方式之间的区别吗?

【问题讨论】:

  • 那些是字段,不是属性;您不能在 setter / getter 中编写代码。
  • @SLaks 你说的是pointOne.xCoor = 9.0; pointOne.yCoor = 7.0; 是字段,而不是属性?
  • 我错过了什么吗?尝试直接访问私有变量会引发异常。
  • 嗯。我还没有运行它 - 你可能是对的..
  • 它们需要被声明为公开才能直接使用

标签: c# java properties setter getter


【解决方案1】:

在 java 中,如果没有公共的 getter 和 setter 方法,则不能从另一个类中设置私有字段。没有getter和setter方法的私有字段只能在同一个类中设置和查看。

例如

public class A {
    private int a;
    private int b;
    private int c;
    public int s;

    public A(){
        a=5; // In same class
        b=3; // In same class
        c=7;
        s=9;
    }

    public int sum(){
        return a+b; // I can access a and b directly, because we are in the same class with them.
    }

    public getC(){
        return c; // Other classes can read value of c with this public method
    }

    public setC(int value){
        c=value; // Other classes can set value of c with this public method
    }

}


public class B{
    private A obj = new A(); // 

    public void someMethod(){
        int t = obj.getC(); // this is ok
        int g = obj.s; // this is ok because s is public
        int f = obj.c // compiler error, c is private, i can't see it from another class directly
        int p = obj.a // compiler error, a is private, i can't see it from another class directly
    }
}

【讨论】:

    【解决方案2】:

    现在,我的问题是,在 Java 中(我刚学过) - 您还可以通过 pointOne.xCoor = .. 通过类似属性的声明来设置私有变量,当然,通过与 pointOne 相同的方式获取它们.xCoor。

    不同之处在于,如果您希望在设置 xCoor 时发生一些特殊行为,那么在 Java 中是不可能的,除非您确保人们总是通过“getter”和“setter”访问该字段" 方法:

    point.setXCoor(1);
    

    在 C# 中,您可以简单地更改属性的实现:

    public string XCoor
    {
        get { return this.xCoor; }
        set { 
           if(value < 0) 
               throw new Exception("Negative values not allowed");
           xCoor = value; 
        }
    }
    

    另一种说法是,C# 属性只是“getXxx()”和“setXxx()”方法的“语法糖”,这样您就可以避免经常键入“get”和“set”。 “自动属性” (get; set;) 只是语法糖,以避免为这些 getter 和 setter 方法创建自己的自定义实现。在幕后,编译器实际上为您创建了一个私有字段,就像您为 Java 类上的字段编写 get 和 set 方法一样。

    【讨论】:

    • 谢谢小条!关于 C# 属性和 Java 字段之间的区别,我还有什么需要了解的吗?
    • @theGreenCabbage:关键是将 C# fields 与 Java 字段进行比较。然后,观察人们如何在 Java 中创建 getset 方法以允许从类外部访问这些私有字段。然后将 C# 属性视为允许您将完成此操作所需的 5 行代码组合成一行,并使用更好的语法。 C# 中的 foo.Bar = 5 不等同于 Java 中的 foo.bar = 5:它等同于 foo.setBar(5)
    • 谢谢。 Java 中还没有实现属性有什么原因吗?
    • @theGreenCabbage:这是一个政治讨论,就像任何事情一样。有些人觉得“变量设置”语法实际上可以在幕后执行逻辑并不好:至少当你调用一个方法时,你知道它可能做的不仅仅是设置一个值。此外,Java 世界比 C# 更厌恶变化和行动缓慢。例如,经过多年的思考,Java 8 终于有了 lambdas。许多渴望获得更好功能但仍希望与 JVM 兼容的开发人员已转向 Scala(支持属性语法)。
    【解决方案3】:

    Java 没有属性。将 Java 的 getter 和 setter 视为 C# 的等价物
    属性的 getter 和 setter。将 Java 的字段视为 C# 的等价物
    场地。事实上,C# 允许您在不明确指定的情况下声明属性
    该字段,并不意味着该字段在 C# 中不存在。如果我没记错的话,在以前的
    在 C# 版本中,您必须明确声明字段(因此,如果您有一个属性
    X,您通常会有一个支持字段,例如 _x)。另请注意,在 C# 中它是
    很少有像getXsetX 这样的方法(只是因为你可以做到
    通过属性X 的getter 和setter 相同)。如果你使用这样的方法,它会得到
    很明显你是从 Java 进入 C# 的 :)

    【讨论】:

    • Think of the Java's getter and setter as the C#'s 你的意思是Java's accessors and mutators
    • 是的,这就是我的意思。它们在 Java AFAIK 中也称为 getter 和 setter 方法。
    猜你喜欢
    • 2012-07-05
    • 2012-10-03
    • 2011-05-31
    • 1970-01-01
    • 2018-11-17
    • 2012-10-21
    • 2011-06-22
    • 2012-08-27
    • 2011-02-02
    相关资源
    最近更新 更多