首先,我想说我对Python编程相当新,因此我解决问题的方法可能不正确,如果是这种情况请告诉我.
我试图使用Singleton类在我的代码中存储配置参数,并在需要时使用它.我遇到一个问题,即初始创建中存储在Singleton中的数据不会保留在对Object的后续调用中.
也许我创建Singleton对象的方式不正确,但我正在关注SO上的代码示例.
首先是我的Singleton课程
class Config(object):
__instance = None
dbserver = ""
def __new__(cls):
if cls.__instance == None:
__instance = object.__new__(cls)
__instance.name = "Configuration Object"
return __instance
Run Code Online (Sandbox Code Playgroud)
这是我最初创建的Singleton实例
configurator = Config()
configurator.dbserver = dbserver
Run Code Online (Sandbox Code Playgroud)
然后我执行以下操作,dbserver属性返回空字符串.
configurator = Config()
print configurator.dbserver
Run Code Online (Sandbox Code Playgroud)
谢谢你的时间阅读.
我有一个"加载..."覆盖UIView子类,在我的应用程序的各个地方使用.视图看起来总是一样的,并且一次不应该使用多个视图.这似乎是使用单身人士的好地方.为简单起见,我想只是类的方法showOverlay和hideOverlay,让每一个使用它不具有类来管理它的一个实例.它到处都是重复的代码.
我的直觉告诉我这是一个坏主意,但我不确定为什么会这样.它被认为是一种不好的做法吗?这是一个简单的视图,不应占用太多内存.
我有一个Logger类,可以在我的应用程序中记录事件.虽然我在这个应用程序中只需要一个记录器实例,但我希望这个类可以重用,所以我不想让它成为单例并将它与我对该应用程序的特定需求结合起来.
我希望能够从应用程序的任何位置访问此Logger实例,而无需每次都创建一个新的实例或将其传递给可能需要记录某些内容的每个类.我目前所做的是有一个ApplicationUtils单例,我用它作为应用程序Logger的访问点:
object ApplicationUtils {
lazy val log : Logger = new Logger()
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个Loggable特性,我添加到需要Logger的类:
trait Loggable {
protected[this] lazy val log = ApplicationUtils.log
}
Run Code Online (Sandbox Code Playgroud)
对于我想要实现的目标,这是一种有效的方法吗?感觉有点黑客.我可以使用更好的方法吗?我对Scala很新.
我需要一个标准列表,从中创建谓词以返回根据用户输入进行各种排序的数据.因此,创建一个名为"SearchSpecs"的实体及其相关的子类文件SearchSpecs.h和似乎是合理的SearchSpecs.m.通过这种方式,我的其他类可以使用此类中的方法和属性来创建一个"规范表",从中启动Core Data fetch.
但是,我注意到"单身人士"似乎存在很多争议.我很新,据我所知,从来没有创造过一个单身人士,想知道我现在是不是这样做了?
明白我不想重新开放或煽动单身辩论的火焰,因为我真的不知道它是什么.但我也不想在我的应用程序中创建一些怪物.
有人可以向我保证我的方法安全合理吗?
这是我SearchSpecs.h和SearchSpecs.m文件中的相关代码:
//
// SearchSpecs.h
// WMDGx
//
// Created by Tim Jones on 2/7/14.
// Copyright (c) 2014 TDJ. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface SearchSpecs : NSManagedObject
// Properties
@property (nonatomic, retain) NSDate * fromDate;
@property (nonatomic, retain) NSDate * toDate;
@property (nonatomic, retain) NSString * categoryOfInterest;
@property (nonatomic, retain) NSString * activityOfInterest;
@property (nonatomic, retain) NSString * benchmarkCategory;
@property (nonatomic, retain) …Run Code Online (Sandbox Code Playgroud) 我在ObjectiveC中编写了一个单例,并在我看过的许多站点中看到了这个实现.我真的不明白第一个原始的nil赋值.由于dispatch_once中的块(据我所知......),该方法如何返回先前分配的值(在块内)而不是nil.
+ (id)sharedManager {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
Run Code Online (Sandbox Code Playgroud)
PS - 我注意到这个问题曾经在这里被问到但是没有得到解决,并且没有解释这个问题 - 为什么为单身人士的静态变量分配了一个零
我有一个单身课程
public class Singleton {
static Singleton instance;
public static Singleton getInstance()
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
Run Code Online (Sandbox Code Playgroud)
考虑一个公共函数方法()在类Singleton中定义.
哪个是在单例类中调用方法的最佳方法:
辛格尔顿.method() - 静态调用的方法
要么
Singleton.getInstance.method() - 方法不是静态的?
尝试访问下面的成员变量s会导致以下错误:
错误:'cl :: s {aka singleton}'不是'cl'的基础
class singleton
{
public:
static singleton* getInstance()
{
static singleton* ptr{nullptr};
if(nullptr==ptr)
{
ptr=new singleton;
}
return ptr;
}
private:
int m_var;
};
class cl
{
public:
typedef singleton s;
};
int main()
{
cl* c;
c->s::getInstance();
}
Run Code Online (Sandbox Code Playgroud)
我没想到会出现这种错误.我究竟做错了什么?
class Foo{
void operator=(const Foo&){};
public:
Foo(){};
};
Foo& fooRef(){
static Foo aFoo;
return aFoo;
}
int main() {
Foo &foo = fooRef();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码正常工作,不会发出任何错误.一旦我将主体改为:
int main(){
Foo &foo;
foo = fooRef();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器尝试使用operator=并因此抱怨.所以我的第一个问题是:它为什么会有所作为?
我来到这个事实的方式是我在做单元测试使用CPPunit,我一定要考有签名一个单独的类getInstance()是Singleton& getInstance().为了进行测试,我试图在TestSingleton类中单例初始化一个实例.因此有:
class TestSingleton{
...
private:
Singleton &instance;
};
void TestSingleton::setUp(){
this->instance = Singleton::getInstance();
}
Run Code Online (Sandbox Code Playgroud)
以上示例发出错误(因为operator=声明为私有,如果不是,则很明显我不会被调用).所以第二个问题是:我如何避免这种情况并在我的TestSingleton班级中获得单身实例?
我可以安全地IsBusy从多个线程读取实例化单例的布尔属性,而不会导致任何线程安全问题,或者我已经处于危险水域?
我有一个用java实现的经典单例
public class ClassicSingleton {
private static ClassicSingleton instance = null;
private ClassicSingleton() {} ;
public static ClassicSingleton getInstance() {
if (instance == null)
return new ClassicSingleton();
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
我有以下驱动程序
public class SingletonDriver {
public static void main(String[] args) {
System.out.println(ClassicSingleton.getInstance().toString());
System.out.println(ClassicSingleton.getInstance().toString());
}
}
Run Code Online (Sandbox Code Playgroud)
输出就像是
ClassicSingleton@75e4f66a
ClassicSingleton@aede59e
Run Code Online (Sandbox Code Playgroud)
我以为输出会指向同一个对象.这些值不应该相同吗?