标签: static-variables

在Java中继承静态变量

我想要进行以下设置:

abstract class Parent {
    public static String ACONSTANT; // I'd use abstract here if it was allowed

    // Other stuff follows
}

class Child extends Parent {
    public static String ACONSTANT = "some value";

    // etc
}
Run Code Online (Sandbox Code Playgroud)

这在Java中可行吗?怎么样?如果我可以避免它,我宁愿不使用实例变量/方法.

谢谢!

编辑:

常量是数据库表的名称.每个子对象都是一个迷你ORM.

java polymorphism inheritance static static-variables

4
推荐指数
1
解决办法
8126
查看次数

如何初始化继承类的静态变量?

我正在尝试创建一个“父”类,它为所有继承的类提供通用的构造函数和参数类型。继承的变量之间唯一发生变化的是一些静态变量的值。

实现这一目标的最佳方法是什么?这是我目前的尝试:

class Ball {
  public:
    virtual ~Ball();
    Ball ();

  protected:
    static string file;
    static int size;
    node shape;
};

class TenisBall: public Ball {};
class OtherBall: public Ball {};

Ball::Ball () {
  shape = // do something with file and size
};

Ball::~Ball () {
  delete shape;
};

string TenisBall::file = "SomeFile";
int TenisBall::size = 20;

string OtherBall::file = "OtherFile";
int OtherBall::size = 16;
Run Code Online (Sandbox Code Playgroud)

TenisBall我的问题是:我无法在and类上设置静态值OtherBall,编译器仅接受我在最后两行代码中更改TenisBalland OtherBallfor的情况。Ball我怎样才能做到这一点?这是最好的方法吗?

编辑:

根据提供的答案,我决定尝试使用虚拟函数来实现它。到目前为止,这是我的代码:

class Ball { …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance initialization static-variables

4
推荐指数
2
解决办法
3538
查看次数

对类对象使用objc_setAssociatedObject是否正确?

objc_setAssociatedObject用于类对象是否正确?

我们经常使用类似的静态变量来模拟类变量: Objective C Static Class Level变量 但是,我们可以使用Associated对象作为替代吗?

objc_setAssociatedObject([self class], &STRING_KEY, myString, OBJC_ASSOCIATION_RETAIN);
Run Code Online (Sandbox Code Playgroud)

static class objective-c static-variables ios

4
推荐指数
1
解决办法
852
查看次数

Objective-C上局部静态变量的线程安全性

由于以下代码是Objective-C上非常常见的模式,用于创建实例并确保它是线程安全的.但是这个线程安全是基于一个重要的条件,即本地静态变量是由编译器保证的线程安全,这意味着静态_sharedCache指针将保证以线程安全的方式创建,但是我无法找到任何关于此的文档提及.有人能给我更自信的证据吗?(因为这里的人们一直关注我在开始时使用的可变集,所以我只是把它改成NSCache,这真的不是重点.我在谈论关于在这里创建本地静态指针的线程安全性(不是这个实例)指针指向))

+ (NSCache*)sharedCache {
  static NSCache* _sharedCache = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    _sharedCache = [[NSCache alloc] init];
  });
  return _sharedCache;
}
Run Code Online (Sandbox Code Playgroud)

为了防止我没有明确描述竞争条件,考虑两个线程同时调用这个API,同时检查这个静态_sharedCache指针是否存在,如果没有,他们将通过他们自己创建一个新的静态指针.那么它可能是NSMutableSet的两个静态指针,即使dispatch_once保证实例初始化只发生过一次,也就是这两个静态指针中的一个,然后在dispatch_once块之后,第一个调用者得到满意的结果,但是第二个调用者只是返回一个零指针;

考虑这种情况,A和B是两个线程,同时输入这个代码,A在这里检查静态指针"_sharedSet",发现这里没有这样的指针,(指针是unsigned long的实例),所以它创建一个并赋值0对它来说,现在这个指针存储在内存地址(0xAAAAAAAA)中,同时B做了相同的行为,在堆中创建了一个静态指针但是带有内存地址(0xBBBBBBBB),然后dispatch_once阻塞了两个线程直到它完成,所以它分配了一个新的指针值与创建的NSSet实例并将此值分配给地址0xAAAAAAAA,但地址0xBBBBBBBB上的值仍为0,因为没有人更新它,所以它的线程B只返回一个nil.所以基本上我的问题不是怀疑dispatch_once,而是关于创建本地静态变量的线程安全性的两倍,这是C++上的一个有效问题,直到C11解决它.我只是想知道Clang是否也注意到了这个问题.

这个问题是肯定不dispatch_once,它是关于当地的静态变量,是特定的非对象变量,作为指针这里所提到的,或者只是改变的方式来问,如果叫在竞争线程下面的代码,这是否"_intBuffer"将保证堆中只有一个实例?

    +(int)sharedIntBuffer {
        static int _intBuffer = 0;
        return _intBuffer;
    }
Run Code Online (Sandbox Code Playgroud)

multithreading objective-c static-variables race-condition

4
推荐指数
1
解决办法
1052
查看次数

C#中具有复杂初始化的静态字符串变量

我有一个带有静态字符串变量的类,它具有一些有点复杂的初始化(我不能将它设置为等于带引号的字符串"whatever").我需要运行几行代码来实际创建值.一旦设置,其值将不会改变.它目前被设置为刚刚在第一次调用时设置的属性get.

class MyClass
{
    private static string _myString = "";
    public static string MyString
    {
        get
        {
            if(_myString == "")
            {
                // use an object "obj" here to create the value
                MyObject obj = new MyObject();
                obj.someSetupHere();
                _myString = obj.ToString();
            }
            return _myString;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:有更好的方法吗?我希望在设置所有其他变量时设置值,而不是在值的第一个"get"上设置.我应该在Lazy<T>这里使用吗?我真的很喜欢这样的东西:

private static string _myString = 
{
        // use an object "obj" here to create the value
        MyObject obj = new MyObject();
        obj.someSetupHere();
        _myString = obj.ToString();
}
Run Code Online (Sandbox Code Playgroud)

我知道这可能不是有效的语法,但希望它传达了我正在尝试做的事情.

c# static-variables lazy-initialization

4
推荐指数
1
解决办法
468
查看次数

枚举:使用枚举和带有静态变量的类之间的区别

我对使用enum和使用 ajava class和定义有一个小问题static variables

例如,我们可以定义枚举,如下所示:-

public enum RequestCodeEnum {

    TRANSACTION(1), REPORTS(2), BUDGET(3), CATEGORY(4), CURRENCY(5);

    private int value;

    private RequestCodeEnum(int value) {
        this.value = value;
    }

    public int getCode(){
        return value;
    }

}
Run Code Online (Sandbox Code Playgroud)

对于同样的事情,我们可以使用带有静态变量的 java 类,例如:-

public class ActivityRequestCode {

    public static int TRANSACTION_CODE  = 1;
    public static int REPORTS           = 2;
    public static int BUDGET            = 3;
    public static int CATEGORY          = 4;
    public static int CURRENCY          = 5;

}
Run Code Online (Sandbox Code Playgroud)

为了调用这两个类,我们可以这样做:-

int i = …
Run Code Online (Sandbox Code Playgroud)

java enums android design-patterns static-variables

4
推荐指数
1
解决办法
1775
查看次数

C++中静态变量的存储位置是什么时候确定的?

我有以下简单的程序:

int main()
{
    int x = 5;
    static int y = x;
    return (0);
}
Run Code Online (Sandbox Code Playgroud)

用 gcc 编译它,它会产生该行的错误,static int y = x;因为“初始化元素不是常量”。我认为这是由于它y是一个静态变量,在编译时需要知道其存储位置(数据/bss)和初始值。

但是,当使用 g++ 编译时,我没有收到任何错误并且程序运行良好(y打印出 5 个)。

我的问题是:

  1. 我的假设正确吗?
  2. 如果是这样,为什么可以在 C++ 中对静态变量进行这样的初始化?

c c++ build static-variables

4
推荐指数
2
解决办法
105
查看次数

使用什么而不是静态变量

在C++程序中,我需要一些辅助的常量对象,这些对象将被实例化一次,最好是在程序启动时.这些对象通常在同一个翻译单元中使用,因此最简单的方法是将它们设置为静态:

static const Helper h(params);
Run Code Online (Sandbox Code Playgroud)

但是有这个静态初始化顺序问题,所以如果Helper引用其他一些静态(via params),这可能会导致UB.

另一点是我最终可能需要在几个单元之间共享此对象.如果我离开它static并放入.h文件,那将导致多个对象.我可以通过打扰extern等来避免这种情况,但这最终会引发相同的初始化顺序问题(而不是说它看起来非常C-ish).

我想过单身人士,但由于样板代码和不方便的语法(例如MySingleton::GetInstance().MyVar),这将是一种过度杀伤- 这些对象是助手,所以他们应该简化事情,而不是让他们复杂化......

相同的C++ FAQ 提到了这个选项:

 Fred& x()
 {
   static Fred* ans = new Fred();
   return *ans;
 } 
Run Code Online (Sandbox Code Playgroud)

这真的被使用并被认为是一件好事吗?我应该这样做,还是你会建议其他选择?谢谢.

编辑:我应该澄清为什么我真的需要帮助器:它们非常像常规常量,并且可以预先计算,但在运行时更方便.我宁愿在main之前实例化它们,因为它会自动解决多线程问题(在C++ 03中没有保护本地静态).另外,正如我所说,它们通常仅限于翻译单元,因此导出它们并在main()中初始化是没有意义的.您可以将它们视为常量,但仅在运行时已知.

c++ singleton static-variables

3
推荐指数
1
解决办法
815
查看次数

从类方法访问属性?

为了使我的代码可测试,我创建了一个惰性初始化器; 这样在我的单元测试中,我可以在调用getter之前模拟我想要的任何对象.

但是,对于类方法,我的类方法无法访问我定义的属性.

  1. 有没有办法让我的类方法可以访问属性?
  2. 如果没有,有没有办法创建也可以在这个类之外访问的静态变量,即可以通过我的单元测试类访问?

@implementation
@synthesize webService;

+ (void)doSomething
{
   self.webService.url = @"some url";
   [self.webService start];
   // do other things
}

- (WebService*)webService
{
   if (!webService)
   {
      webService = [[WebService alloc] init];
   }
   return webService;
}

@end
Run Code Online (Sandbox Code Playgroud)

objective-c static-variables class-method

3
推荐指数
1
解决办法
9872
查看次数

静态变量导致mvc中的并发问题

我们使用mvc4开发Web应用程序.在许多情况下,我们将从First Page/View中的用户获得价值,我们需要保留一些变量,直到用户到达最终页面/视图.他/她可以通过4-5个视图从第一个视图到达最终视图.

保持MVC中的价值.我们有3种方式.

1.全局变量 - 但是如果我在一个动作方法中赋值.该值将在另一个操作方法中重置.所以我们放弃了它.

2.Session - 但我们需要在每个会话中保留5个以上的值.所以我们放弃了它.

3.Static Varibale - 其功效与魅力相似.但在多用户中它导致了并发问题.

mvc中还有其他任何方法可以保持价值吗?请指导我.

c# oop asp.net-mvc static-variables asp.net-mvc-4

3
推荐指数
1
解决办法
1205
查看次数