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