将变量/静态变量用于 'name' 值以提高可读性

Using variables / Static variables to 'name' values to aid readability

public class myObject extends someOtherObject(){

    final int MAINBOX_X = 0;
    final int MAINBOX_Y = 1;
    final int BUTTON_X = 2;
    final int BUTTON_Y = 3;
    final int TEXT_X = 4;
    final int TEXT_Y = 5;

    public myObject(int x, int y){

        super();

        //'coordinates' is an array of pairs, x and y for example
        coordinates[MAINBOX_X] = x;
        coordinates[MAINBOX_Y] = y;
        coordinates[BUTTON_X] = coordinates[MAINBOX_X]+10;
        coordinates[BUTTON_Y] = coordinates[MAINBOX_Y]+10;
        coordinates[TEXT_X] = coordinates[MAINBOX_X]+10;
        coordinates[TEXT_Y] = coordinates[MAINBOX_Y]+50;

        //This aids readability because the alternative would be:
        //coordinates[0] = x;  //Where 0 is the index representing the object's x coordinate
        //coordinates[1] = y;  //Where 1 is the index representing the object's y coordinate
        //coordinates[2] = coordinates[0]+10;
        //coordinates[3] = coordinates[1]+10;
        //etc....
        //This could easily get very confusing without using proper/recognisable names!


    }
}

现在如果我创建很多论文对象。假设其中有 400 个。 (注意,这只是一个简单的例子,实际项目中不仅仅是X和Y值还有很多)

我已经阅读了所有 'statics are bad' 类的帖子,我想了解的是当我创建所有这些对象时,内存中会有这些最终整数的多个副本 - 这似乎对我来说没有必要,因为值总是相同的。

但是,如果我将它们声明为 statics/class 变量,那么所有对象都将共享一个变量副本,因此,只会创建一个副本 - 内存效率更高?

静力学分离class

另一种方法是创建一个 'values' class 并放置静力学 - 只是为了保持整洁。 (尽管说实话,我 可以 简单地将原始 class/object 的引用传递给需要访问这些值的 class。

为此目的使用 static/class 变量是否可以接受?如果没有,什么是更好的选择?

static 变量被视为 "bad",因为它们使对象的状态复杂化。一个实例可能会无意中受到另一个实例的影响,这可能会导致难以诊断错误。对于 final 基元(读取:常量),这不是问题,拥有它们确实没有问题:

public class myObject extends someOtherObject(){

    private static final int X = 0;
    private static final int Y = 1000;

    // rest of the class...
}

假设您有 100 个 MyObject 对象,并且所有成员都是最终的,static.This 意味着所有这 100 个对象都具有相同的不可更改的静态变量,因为 final.so 您无法更改这些成员other 99 objects.So 你不能在你的情况下同时使用 static 和 final。

想想没有 final 只有 static members.This 意味着你不需要创建 MyObject 的实例对象 class 因为你可以在任何地方使用这些变量(你想在那里传递这些变量的地方)按 Class 姓名。

如果您希望每个实例对象都有特定的变量,您可以在使用实例对象和非静态和非最终变量后更改这些变量。

我认为在你的情况下使用静态变量是好的,因为所有 100 个对象都使用相同的变量和相同的 values.So 你不会为你不需要的所有 objects.Actualy 占用额外的内存100 objects.You 只需要一个 class 及其静态非最终变量

在 Java 中有一些实践使用 final static 来命名整数值(例如 http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingConstants.html),但不是专门用于您描述的目的:

在大多数情况下,应将使用数组存储语义不同的数据视为代码异味。在您的示例中,您使用 Y = 1000 但在您自己的解释中却感到困惑,因为等价物突然变成了 1.

我认为在你的例子中,你要么是想描述一个二维数组,要么是在考虑 X 可能永远不会超过 999?

我的建议你应该做什么:

  • 使用枚举来避免一堆 Xs 和 Ys 飞来飞去。嘿,枚举也使用 static final 作为枚举值!
  • 如果您真的必须使用静态最终整数,请聪明地将它们命名为 X-DIM 和 Y-DIM 或其他不要混淆 reader 的名称。 X 和 Y 对 reader.
  • 没有任何指示
  • 如果您可以将问题映射到使用静态一对一映射,您是否考虑过使用 class 成员而不是数组?
  • 如果这真的是关于低级编程和准备序列化数据,那么使用 Google Protobufs 等定制解决方案怎么样?