我想要进行以下设置:
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.
我正在尝试创建一个“父”类,它为所有继承的类提供通用的构造函数和参数类型。继承的变量之间唯一发生变化的是一些静态变量的值。
实现这一目标的最佳方法是什么?这是我目前的尝试:
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) objc_setAssociatedObject用于类对象是否正确?
我们经常使用类似的静态变量来模拟类变量: Objective C Static Class Level变量 但是,我们可以使用Associated对象作为替代吗?
objc_setAssociatedObject([self class], &STRING_KEY, myString, OBJC_ASSOCIATION_RETAIN);
Run Code Online (Sandbox Code Playgroud) 由于以下代码是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) 我有一个带有静态字符串变量的类,它具有一些有点复杂的初始化(我不能将它设置为等于带引号的字符串"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)
我知道这可能不是有效的语法,但希望它传达了我正在尝试做的事情.
我对使用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) 我有以下简单的程序:
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 个)。
我的问题是:
在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()中初始化是没有意义的.您可以将它们视为常量,但仅在运行时已知.
为了使我的代码可测试,我创建了一个惰性初始化器; 这样在我的单元测试中,我可以在调用getter之前模拟我想要的任何对象.
但是,对于类方法,我的类方法无法访问我定义的属性.
@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) 我们使用mvc4开发Web应用程序.在许多情况下,我们将从First Page/View中的用户获得价值,我们需要保留一些变量,直到用户到达最终页面/视图.他/她可以通过4-5个视图从第一个视图到达最终视图.
保持MVC中的价值.我们有3种方式.
1.全局变量 - 但是如果我在一个动作方法中赋值.该值将在另一个操作方法中重置.所以我们放弃了它.
2.Session - 但我们需要在每个会话中保留5个以上的值.所以我们放弃了它.
3.Static Varibale - 其功效与魅力相似.但在多用户中它导致了并发问题.
mvc中还有其他任何方法可以保持价值吗?请指导我.
static-variables ×10
c++ ×3
objective-c ×3
c# ×2
inheritance ×2
java ×2
static ×2
android ×1
asp.net-mvc ×1
build ×1
c ×1
class ×1
class-method ×1
enums ×1
ios ×1
oop ×1
polymorphism ×1
singleton ×1